C#实现纳秒级的计时器功能

常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,精度也很不好。

我们要另外寻找一种方法来精确测量时间。

Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比"标准的"毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。

虽然在 C# 中使用"非托管"的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。

下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数功能的封装。

代码封装

cs 复制代码
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;

namespace Win32
{
    internal class HighTimer
    {
        [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 HighTimer()
        {
            startTime = 0;
            stopTime = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // 不支持高性能计数器
                throw new Win32Exception();
            }
        }

        // 开始计时器
        public void Start()
        {
            // 来让等待线程工作
            Thread.Sleep(0);
            QueryPerformanceCounter(out startTime);
        }

        // 停止计时器
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }

        // 返回计时器经过时间(单位:秒)
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double)freq;
            }
        }
    }
}

调用方法

cs 复制代码
HighTimer pt = new HighTimer();    // 创建新的 HighTimer 对象
pt.Start();                         // 启动计时器
Console.WriteLine("Test/n");        // 需要计时的代码
pt.Stop();                          // 停止计时器
Console.WriteLine("Duration: {0} sec/n", pt.Duration); // 打印需要计时部分代码的用时

参考链接

https://mp.weixin.qq.com/s/xIRvgT8HSB0RKOhWV___zQ

特此记录

anlog

2024年5月28日

相关推荐
力学与人工智能7 小时前
AST | 西工大张凯军、刘溢浪等:一种翼型动态失速流场高效高精度预测的新视角
高精度·预测·新视角·翼型·动态失速
大势智慧5 天前
智影R200免像控空地融合建模解决方案
高精度·解决方案·slam·三维重建·三维扫描·手持slam·空地融合
lynnlovemin5 天前
C++高精度加减乘除算法详解
开发语言·c++·算法·高精度
津津有味道7 天前
Python定时器读取NFC标签内NDEF网址模拟键盘输出URL并打开Web网页,支持Ubunt、统信、麒麟等国产Linux系统
python·网址·定时器·网页·nfc·uri·读写ini配置
Zzzzmo_14 天前
【JavaEE】多线程04—线程池/定时器
java·线程池·定时器·javaee
qeen8717 天前
【算法笔记】模拟与高精度加减乘除
c++·笔记·算法·高精度·模拟
北京阿尔泰科技厂家19 天前
24位高精度热电阻采集模块DAM-3149A:工业测温领域的全能新标杆
人工智能·高精度·仪器仪表·工业自动化数据采集·分布式监测数据采集·工业测温·热电阻采集模块
杰杰桀桀桀20 天前
STM32高精度定时器(HRTIM1)实现倍频、定时器触发采样
stm32·单片机·嵌入式硬件·电赛·高精度定时器
今天又在学代码写BUG口牙22 天前
MFC 定时器轮询实现按住按钮进度条增加(鼠标悬停/长按检测)
c++·mfc·定时器·鼠标·轮询·长按事件
We་ct1 个月前
JS手撕:性能优化、渲染技巧与定时器实现
开发语言·前端·javascript·面试·性能优化·定时器·性能