主要用到了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#计时器类内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!