当前位置: 首页 > web >正文

【C#获取高精度时间】

在C#中,有几种方法可以获取高精度时间(高分辨率时间戳),适用于性能测量、计时等需要高精度的场景。以下是几种常用方法:

1. 使用 Stopwatch 类(推荐)

Stopwatch 类提供了最高精度的时间测量,适用于测量时间间隔。

using System;
using System.Diagnostics;class Program
{static void Main(){// 创建Stopwatch实例Stopwatch stopwatch = new Stopwatch();// 开始计时stopwatch.Start();// 执行一些操作for (int i = 0; i < 1000000; i++){var x = Math.Sqrt(i);}// 停止计时stopwatch.Stop();// 获取经过的时间Console.WriteLine($"Elapsed Time: {stopwatch.Elapsed}");Console.WriteLine($"Elapsed Milliseconds: {stopwatch.ElapsedMilliseconds}");Console.WriteLine($"Elapsed Ticks: {stopwatch.ElapsedTicks}");// 检查计时器频率Console.WriteLine($"Frequency: {Stopwatch.Frequency} ticks per second");Console.WriteLine($"IsHighResolution: {Stopwatch.IsHighResolution}");}
}

2. 使用 DateTime.UtcNow(精度较低)

虽然不如 Stopwatch 精确,但在某些简单场景下可以使用:

DateTime startTime = DateTime.UtcNow;// 执行一些操作
for (int i = 0; i < 1000000; i++)
{var x = Math.Sqrt(i);
}DateTime endTime = DateTime.UtcNow;
TimeSpan elapsed = endTime - startTime;Console.WriteLine($"Elapsed Time: {elapsed}");

3. 使用 P/Invoke 调用 Windows 高精度计时器

如果需要更高精度或与原生代码交互,可以使用 Windows API:

using System;
using System.Runtime.InteropServices;class Program
{[DllImport("kernel32.dll")]private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);[DllImport("kernel32.dll")]private static extern bool QueryPerformanceFrequency(out long lpFrequency);static void Main(){long frequency;QueryPerformanceFrequency(out frequency);long start;QueryPerformanceCounter(out start);// 执行一些操作for (int i = 0; i < 1000000; i++){var x = Math.Sqrt(i);}long end;QueryPerformanceCounter(out end);double elapsed = (end - start) / (double)frequency;Console.WriteLine($"Elapsed Time: {elapsed} seconds");}
}

4. 使用 .NET Core 3.0+ 的 TimeProvider(.NET 6+)

在 .NET 6 及更高版本中,可以使用 TimeProvider 抽象:

using System;var timeProvider = TimeProvider.System;
long startTimestamp = timeProvider.GetTimestamp();// 执行一些操作
for (int i = 0; i < 1000000; i++)
{var x = Math.Sqrt(i);
}long endTimestamp = timeProvider.GetTimestamp();
double elapsed = timeProvider.GetElapsedTime(startTimestamp, endTimestamp).TotalSeconds;Console.WriteLine($"Elapsed Time: {elapsed} seconds");

注意事项

  1. 精度差异

    • Stopwatch 通常提供最高精度(取决于硬件,可能是微秒级)
    • DateTime 的精度通常约为10-15毫秒
    • Windows 的 QueryPerformanceCounter 通常与 Stopwatch 精度相同
  2. 跨平台考虑

    • Stopwatch 在所有平台上都能提供最佳可用精度
    • 直接 P/Invoke 方法仅适用于 Windows
  3. 时间戳与日历时间

    • 高精度计时器通常返回的是相对于某个任意起点的时间戳,不是日历时间
    • 如果需要日历时间,应使用 DateTime.UtcNowDateTimeOffset.UtcNow

对于大多数性能测量场景,Stopwatch 是最佳选择。

注:内容由AI生成

http://www.xdnf.cn/news/16722.html

相关文章:

  • Prometheus + Grafana + Micrometer 监控方案详解
  • JVM指令集
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)
  • Python与Spark
  • 【深度学习】独热编码(One-Hot Encoding)
  • C++_红黑树树
  • CMake 完全实战指南:从入门到精通
  • 使用redis 作为消息队列时, 如何保证消息的可靠性
  • Leetcode 08 java
  • 鸿蒙Harmony-自定义List组件,解决List组件手势滑动点击卡住问题
  • Apache Ignite 的分布式队列(IgniteQueue)和分布式集合(IgniteSet)的介绍
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解
  • Java07--面向对象
  • 自动调优 vLLM 服务器参数(实战指南)
  • 如何用USRP捕获手机信号波形(下)协议分析
  • 怎么理解使用MQ解决分布式事务 -- 以kafka为例
  • 小白学OpenCV系列1-图像处理基本操作
  • 机器学习-十大算法之一线性回归算法
  • gTest测试框架的安装与配置
  • Qt 并行计算框架与应用
  • 项目优化中对象的隐式共享
  • 从单机架构到分布式:Redis为何成为架构升级的关键一环?
  • 【开源项目】轻量加速利器 HubProxy 自建 Docker、GitHub 下载加速服务
  • Less Less基础
  • Docker学习相关视频笔记(二)
  • 负载均衡、算法/策略