C#精确到纳秒级别的计时器类
2021/8/21 11:05:59
本文主要是介绍C#精确到纳秒级别的计时器类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
主要用到了win32里面的 QueryPerformanceCounter和QueryPerformanceFrequency两个函数
文档链接:https://docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
1 class NanoSecondTimer 2 { 3 4 [DllImport("Kernel32.dll")] 5 private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 6 7 [DllImport("Kernel32.dll")] 8 private static extern bool QueryPerformanceFrequency(out long lpFrequency); 9 10 private long startTime, stopTime; 11 private long freq; 12 public NanoSecondTimer() 13 { 14 startTime = 0; 15 stopTime = 0; 16 if (QueryPerformanceFrequency(out freq) == false) 17 { 18 throw new Win32Exception(); 19 } 20 } 21 22 /// <summary> 23 /// 开始计时 24 /// </summary> 25 public void Start() 26 { 27 Thread.Sleep(0); 28 QueryPerformanceCounter(out startTime); 29 } 30 31 /// <summary> 32 /// 停止计时 33 /// </summary> 34 public void Stop() 35 { 36 QueryPerformanceCounter(out stopTime); 37 } 38 39 /// <summary> 40 /// 返回计时器经过时间(单位:秒) 41 /// </summary> 42 public double Duration 43 { 44 get 45 { 46 return (double)(stopTime - startTime) / (double)freq; 47 } 48 } 49 }View Code
QueryPerformanceFrequency这个函数会检索性能计数器的频率。性能计数器的频率在系统启动时是固定的,并且在所有处理器上都是一致的。因此,只需在应用初始化时查询频率,即可缓存结果。在运行 Windows XP 或更高版本的系统上,该函数将始终成功,因此永远不会返回零。
下面是测试代码:
1 NanoSecondTimer nanoSecondTimer = new NanoSecondTimer(); 2 nanoSecondTimer.Start(); 3 for (int i = 0; i < 100000; i++) 4 { 5 i++; 6 } 7 nanoSecondTimer.Stop(); 8 double time = nanoSecondTimer.Duration;View Code
这篇关于C#精确到纳秒级别的计时器类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#