博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中的高性能计时器(Daniel Strigl著,野比译)
阅读量:2456 次
发布时间:2019-05-10

本文共 2228 字,大约阅读时间需要 7 分钟。

这是2008年翻译的奥地利人Daniel Strigl的Hi-performance Timer in C#一文。

还是那句话,请尽量保留版权,这些老外的文章可以随便用,但都是有条件的,参见CPOL

先上源码:

[奥地利]Daniel Strigl 著 野比 译

来源:http://www.codeproject.com

作者:野比 ()

时间:May, 2012

简介

精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。
故而,我们要另外寻找一种方法来精确测量时间。
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。
第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。
然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。
duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率
需要关于 QueryPerformanceCounter 和 QueryPerformanceFrequency 的更多信息,请参阅 MSDN 文档。
代码
下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数的功能。

[csharp] 
  1. using System;  
  2. using System.Runtime.InteropServices;  
  3. using System.ComponentModel;  
  4. using System.Threading;  
  5.   
  6. namespace Win32  
  7. {  
  8.     internal class HiPerfTimer  
  9.     {  
  10.         [DllImport("Kernel32.dll")]  
  11.         private static extern bool QueryPerformanceCounter(  
  12.             out long lpPerformanceCount);  
  13.   
  14.         [DllImport("Kernel32.dll")]  
  15.         private static extern bool QueryPerformanceFrequency(  
  16.             out long lpFrequency);  
  17.   
  18.         private long startTime, stopTime;  
  19.         private long freq;  
  20.   
  21.         // 构造函数  
  22.         public HiPerfTimer()  
  23.         {  
  24.             startTime = 0;  
  25.             stopTime  = 0;  
  26.   
  27.             if (QueryPerformanceFrequency(out freq) == false)  
  28.             {  
  29.                 // 不支持高性能计数器  
  30.                 throw new Win32Exception();  
  31.             }  
  32.         }  
  33.   
  34.         // 开始计时器  
  35.         public void Start()  
  36.         {  
  37.             // 来让等待线程工作  
  38.             Thread.Sleep(0);  
  39.   
  40.             QueryPerformanceCounter(out startTime);  
  41.         }  
  42.   
  43.         // 停止计时器  
  44.         public void Stop()  
  45.         {  
  46.             QueryPerformanceCounter(out stopTime);  
  47.         }  
  48.   
  49.         // 返回计时器经过时间(单位:秒)  
  50.         public double Duration  
  51.         {  
  52.             get  
  53.             {  
  54.                 return (double)(stopTime - startTime) / (double) freq;  
  55.             }  
  56.         }  
  57.     }  
  58. }  
使用这个类很简单。只需要创建一个 HiPerfTimer 的实例,然后调用 Start() 开始计时,Stop() 停止计时。要获得经过的时间,调用 Duration() 函数即可。参考下面的例子。

[csharp] 
  1. HiPerfTimer pt = new HiPerfTimer();     // 创建新的 HiPerfTimer 对象  
  2. pt.Start();                             // 启动计时器  
  3. Console.WriteLine("Test\n");            // 需要计时的代码  
  4. pt.Stop();                              // 停止计时器  
  5. Console.WriteLine("Duration: {0} sec\n",   
  6.      pt.Duration); // 打印需要计时部分代码的用时  
下面的图片是该例子在我系统上的输出。

--------野比见解--------

由于这个计时器精度太高,我想除了工控或采集等项目,其他地方应该是用不到的吧?

(全文完)

转载地址:http://xtdhb.baihongyu.com/

你可能感兴趣的文章
客户要求开放接口_开放社区教我们如何增强客户能力
查看>>
和平友善敬业民主和平_合作如何推动绿色和平组织的发展突破
查看>>
容器 发展趋势_容器现实检查和更多行业趋势
查看>>
如何在开源社区贡献代码_在Hacktoberfest期间为开源做出贡献的5种方法
查看>>
cantata测试工具_我如何构建和维护开源音乐播放器Cantata
查看>>
如何在Java中比较字符串
查看>>
Bash外壳的诞生
查看>>
采用自上而下的语法分析中_为什么是时候采用自上而下的网络安全实践
查看>>
人工智能 lisp_与机器对话:Lisp和AI的起源
查看>>
rust 所有权_对其进行编码,运输,拥有完整服务所有权
查看>>
Linux Plumbers,Appwrite和更多行业趋势
查看>>
罗马复兴开源代码_社区主导的开源复兴
查看>>
cuda编程示例_约束编程示例
查看>>
ai面谈技巧_AI时代的人际化技巧
查看>>
low==dfn 为割点_如何为您的Corteza Low Code应用程序创建用户界面
查看>>
如何使用Python ORM工具SQLAlchemy修复常见的陷阱
查看>>
人际交往的套路_系统管理员的人际交流指南
查看>>
DevOpsDays 10年以来的10条违反直觉的要点
查看>>
c语言影响运行速度_C的巨大影响
查看>>
如何为Corteza低码应用程序创建数据结构
查看>>