当前位置: 首页 > news >正文

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

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

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

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

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

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

代码封装

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;}}}
}

调用方法

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日

相关文章:

  • 安卓ANR检测、分析、优化面面谈
  • Sealos CLI快速部署部署K8s集群
  • 七大获取免费https的方式
  • Amazon云计算AWS(三)
  • Java 基础面试300题 (201-230)
  • 2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图
  • Linux 字体管理
  • 07.与jenkins集成实现cicd
  • 数据中台设计方案(原版word获取)
  • Mongodb安装和简单操作
  • ChatGPT-4o 有何特别之处?
  • 计算机网络工程师需要掌握的知识点
  • 2023 N1CTF Junior pwn 顶级签到
  • 如何从0到设计一个CRM系统
  • Docker - Kafka
  • avalon2.2的VM生成过程
  • css系列之关于字体的事
  • jquery ajax学习笔记
  • Laravel 中的一个后期静态绑定
  • mysql_config not found
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于 Cirru Editor 存储格式
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端路由实现-history
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 进程与线程(三)——进程/线程间通信
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #QT项目实战(天气预报)
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C++哈希表01)
  • (Java数据结构)ArrayList
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (回溯) LeetCode 77. 组合
  • (接口自动化)Python3操作MySQL数据库
  • (十一)手动添加用户和文件的特殊权限
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)大型网站架构演变和知识体系
  • ***通过什么方式***网吧
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net Core 生成管理员权限的应用程序
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET多线程执行函数
  • .NET建议使用的大小写命名原则
  • .NET项目中存在多个web.config文件时的加载顺序
  • @Autowired @Resource @Qualifier的区别
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170728]oracle保留字.txt
  • [20171102]视图v$session中process字段含义
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例