首页 > 编程语言 >C#下利用高精度计时器进行计时操作

C#下利用高精度计时器进行计时操作

时间:2023-03-15 10:45:28浏览次数:26  
标签:pt 高精度 C# QueryPerformanceCounter frequency 计时器 public

简介

精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。

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

Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。

第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。

然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。

duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率

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

  1. public class HiperTimer
  2. {
  3. [DllImport("Kernel32.dll")]
  4. private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); //查询高精度计数器该时刻的实际值
  5. [DllImport("Kernel32.dll")]
  6. private static extern bool QueryPerformanceFrequency(out long lpFrequency); //查询高精度计数器每秒的计数次数
  7.  
  8. private long _startTime, _stopTime;
  9. private readonly long _frequency;
  10.  
  11. // 构造函数
  12. public HiperTimer()
  13. {
  14. _startTime = 0;
  15. _stopTime = 0;
  16.  
  17. if (QueryPerformanceFrequency(out _frequency) == false)
  18. {// 不支持高性能计数器
  19. throw new Win32Exception();
  20. }
  21. }
  22.  
  23. // 开始计时器
  24. public void Start()
  25. {
  26. // 来让等待线程工作
  27. Thread.Sleep(0);
  28. QueryPerformanceCounter(out _startTime);
  29. }
  30.  
  31. // 停止计时器
  32. public void Stop()
  33. {
  34. QueryPerformanceCounter(out _stopTime);
  35. }
  36.  
  37. // 返回计时器经过时间(单位:秒)
  38. public double EliminatedSecond
  39. {
  40. get
  41. {
  42. return (_stopTime - _startTime) / (double) _frequency;
  43. }
  44. }
  45.  
  46. public double EliminatedMilliSecond
  47. {
  48. get { return (double) (_stopTime - _startTime)*1000/_frequency; }
  49. }
  50.  
  51. public double EliminatedMicroSecond
  52. {
  53. get { return (double)(_stopTime - _startTime) * 1000000 / _frequency; }
  54. }
  55.  
  56. }

使用过程如下:

  1. private static void Main(string[] args)
  2. {
  3. var pt = new HiperTimer();
  4.  
  5. pt.Start(); // 启动计时器
  6. Console.WriteLine("Test the time.\n"); // 需要计时的代码
  7. pt.Stop(); // 停止计时器
  8.  
  9. Console.WriteLine("Duration: {0} sec",pt.EliminatedSecond);
  10. Console.WriteLine("Duration: {0} ms", pt.EliminatedMilliSecond);
  11. Console.WriteLine("Duration: {0} us", pt.EliminatedMicroSecond);
  12. }

运行结果:

 

来源:https://www.shuzhiduo.com/A/QW5YXnZ3Jm/

标签:pt,高精度,C#,QueryPerformanceCounter,frequency,计时器,public
From: https://www.cnblogs.com/Jamesblog/p/17217631.html

相关文章

  • LeetCode474 一和零
    题目描述给你一个二进制字符串数组strs和两个整数m和n。请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y......
  • 故障etcd 节点 加入现有集群
    故障etcd节点加入现有集群恢复步骤:1、查看故障节点的etcd状态并关闭服务    systemctlstatusetcd &&  systemctlstopetcd 2、列出现有的集群节点IDE......
  • 前端react面试题合集
    React的工作原理React会创建一个虚拟DOM(virtualDOM)。当一个组件中的状态改变时,React首先会通过"diffing"算法来标记虚拟DOM中的改变,第二步是调节(reconciliati......
  • 详解React的Transition工作原理原理
    Transition使用姿势Transition是react18引入的新概念,用来区分紧急和非紧急的更新。紧急的更新,指的是一些直接的用户交互,如输入、点击等;非紧急的更新,指的是UI界面......
  • 前端常见react面试题合集
    React高阶组件、Renderprops、hooks有什么区别,为什么要不断迭代这三者是目前react解决代码复用的主要方式:高阶组件(HOC)是React中用于复用组件逻辑的一种高级技巧。H......
  • gin跨域(CROS)时GET和POST正常但PUT和DELETE被阻止
    问题表现同一个项目请求同一个服务时,Get和Post请求正常,但是Put和Delete一直报跨域错误的问题AccesstoXMLHttpRequestat'http://127.0.0.1:8011/api/organization'fr......
  • 这可能是你需要的React实战技巧
    一、父组件通过Ref调用子组件中的方法这里同时演示使用函数组件和类组件的父子组件如何编写子组件React.forwardRefReact.useImperativeHandlepublic、private、pr......
  • PHP message: PHP Fatal error: Uncaught Error: Class 'Mongo' not found
    brew+Nginx+PHP7+MongoDB3.2.9+Mongo-PHP_driver1.40搭好环境后写了个脚本:<?php$connection=newMongo();?>通过网页访问,网页显示空白,查看nginx的错......
  • @Transaction注解的失效场景
    作者:京东物流孔祥东背景事情是这样,最近在实现一个需求的时候,有一个定时异步任务会捞取主表的数据并置为处理中(为了防止任务执行时间过长,下次任务执行把本次数据重复捞取),然......
  • JRC Flink流作业调优指南
    作者:京东物流康琪本文综合ApacheFlink原理与京东实时计算平台(JRC)的背景,详细讲述了大规模Flink流作业的调优方法。通过阅读本文,读者可了解Flink流作业的通用调优措施,并应用......