C#精确到纳秒级别的计时器类实现代码

 更新时间:2021年08月21日 11:03:21   作者:晨晞gg  
这篇文章主要介绍了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#多线程学习之(四)使用线程池进行多线程的自动管理

    这篇文章主要介绍了C#多线程学习之使用线程池进行多线程的自动管理,实例分析了C#中线程池的概念与相关的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C# .NET实现扫描识别图片中的文字

    C# .NET实现扫描识别图片中的文字

    本文以C#及VB.NET代码为例,介绍如何扫描并读取图片中的文字。文中的示例代码介绍详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • C#中List和数组之间转换的方法

    C#中List和数组之间转换的方法

    这篇文章主要介绍了C#中List和数组之间转换的方法,涉及比较简单的转换技巧,需要的朋友可以参考下
    2015-02-02
  • C# WinForm程序设计简单计算器

    C# WinForm程序设计简单计算器

    这篇文章主要为大家详细介绍了C# WinForm程序设计简单计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • c# 适配器模式

    c# 适配器模式

    适配器模式:将一个类的接口转换成客户希望的另一个接口,Adapter使原本由于接口不兼容而不能一起工作的那些类可以一起工作
    2012-10-10
  • c# 文件(夹)创建与删除

    c# 文件(夹)创建与删除

    删除文件夹,参数文件夹路径
    2009-07-07
  • UGUI轮播图组件实现方法详解

    UGUI轮播图组件实现方法详解

    这篇文章主要为大家详细介绍了UGUI轮播图组件的实现方法,支持自动轮播、手势切换等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 基于C#实现热键注册工具类

    基于C#实现热键注册工具类

    这篇文章主要为大家详细介绍了一个验证过的热键注册工具类,使用系统类库user32.dll中的RegisterHotkey函数来实现全局热键的注册,感兴趣的小伙伴可以学习一下
    2023-12-12
  • C#加密解密文件小工具实现代码

    C#加密解密文件小工具实现代码

    一个文件夹加密小工具,该工具是操作文件夹名称的方法实现文件夹的一般加密,文件夹中的文件(视频、图片等)都原封不动的保存在那里
    2012-05-05
  • C#简单实现在网页上发邮件的案例

    C#简单实现在网页上发邮件的案例

    本文分享一个C#利用SMTP发送邮件的案例,提供了前后台代码,方便大家学习。
    2016-03-03

最新评论