这篇文章主要介绍了C#精确到纳秒级别的计时器类,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
主要用到了win32里面的QueryPerformanceCounter和QueryPerformanceFrequency两个函数
文档链接:https://docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
class NanoSecondTimer
    {
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(out long lpFrequency);
        private long startTime, stopTime;
        private long freq;
        public NanoSecondTimer()
        {
            startTime = 0;
            stopTime = 0;
            if (QueryPerformanceFrequency(out freq) == false)
            {
                throw new Win32Exception();
            }
        }
        /// <summary>
        /// 开始计时
        /// </summary>
        public void Start()
        {
            Thread.Sleep(0);
            QueryPerformanceCounter(out startTime);
        }
        /// <summary>
        /// 停止计时
        /// </summary>
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }
        /// <summary>
        ///  返回计时器经过时间(单位:秒)
        /// </summary>
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double)freq;
            }
        }
    }
QueryPerformanceFrequency这个函数会检索性能计数器的频率。性能计数器的频率在系统启动时是固定的,并且在所有处理器上都是一致的。因此,只需在应用初始化时查询频率,即可缓存结果。在运行 Windows XP 或更高版本的系统上,该函数将始终成功,因此永远不会返回零。
下面是测试代码:
NanoSecondTimer nanoSecondTimer = new NanoSecondTimer();
            nanoSecondTimer.Start();
            for (int i = 0; i < 100000; i++)
            {
                i++;
            }
            nanoSecondTimer.Stop();
            double time = nanoSecondTimer.Duration;
到此这篇关于C#精确到纳秒级别的计时器类的文章就介绍到这了,更多相关C#计时器类内容请搜索得得之家以前的文章希望大家以后多多支持得得之家!
				 沃梦达教程
				
			本文标题为:C#精确到纳秒级别的计时器类实现代码
				
        
 
            
        
             猜你喜欢
        
	     - 如何使用C# 捕获进程输出 2023-03-10
 - c# 模拟线性回归的示例 2023-03-14
 - user32.dll 函数说明小结 2022-12-26
 - C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
 - 在C# 8中如何使用默认接口方法详解 2023-03-29
 - WPF使用DrawingContext实现绘制刻度条 2023-07-04
 - .NET CORE DI 依赖注入 2023-09-27
 - Unity Shader实现模糊效果 2023-04-27
 - Oracle中for循环的使用方法 2023-07-04
 - Unity3D实现渐变颜色效果 2023-01-16
 
						
						
						
						
						
				
				
				
				