C#下利用高精度计时器进行计时操作【转】
2012-07-04 19:03
197 查看
简介
精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。
故而,我们要另外寻找一种方法来精确测量时间。
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。
第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。
然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。
duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率
下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数的功能。
View Code
运行结果:
精确的时间计量方法在某些应用程序中是非常重要的。常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,很不精确。
故而,我们要另外寻找一种方法来精确测量时间。
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。这些方法,比“标准的”毫秒精度的计时方法如 GetTickCount() 之类有高得多的精度。另一方面来说,在 C# 中使用“非托管”的 API 函数会有一定的开销,但比起使用一点都不精确的 GetTickCount() API 函数来说要好得多了。
第一个函数 QueryPerformanceCounter() 查询任意时刻高精度计数器的实际值。第二个函数 QueryPerformanceFrequency() 返回高精度计数器每秒的计数值。为了获得某一代码段经历的时间,你需要获得代码段开始前和结束后这两个计时时刻的高精度计数器实际值。这两个值的差指出了代码段执行所经历的时间。
然后通过将差除以每秒计数值(高精度计时器频率),就可以计算经过的时间了。
duration = (stop - start) / frequency
经过时间 = (停止时间 - 开始时间) / 频率
下面的类实现了 QueryPerformanceCounter() 和 QueryPerformanceFrequency() API 函数的功能。
View Code
private static void Main(string[] args) { var pt = new HiperTimer(); pt.Start(); // 启动计时器 Console.WriteLine("Test the time.\n"); // 需要计时的代码 pt.Stop(); // 停止计时器 Console.WriteLine("Duration: {0} sec",pt.EliminatedSecond); Console.WriteLine("Duration: {0} ms", pt.EliminatedMilliSecond); Console.WriteLine("Duration: {0} us", pt.EliminatedMicroSecond); }
运行结果:
相关文章推荐
- C#下利用高精度计时器进行计时操作
- 利用C#对远程服务进行操作,如MSSQLSERVER等。
- 利用C#事务处理对数据库进行多重操作
- 【转】 如何利用C#代码来进行操作AD
- 在C#中利用SQL语句与数据库进行操作
- C#窗体中利用richtextbox控件,打开指定word文件,并进行编辑保存等操作,出现Office或者是Interop未定义的解决方案
- c#利用反射Assembly 对类和成员属性进行操作
- 如何利用C#代码来进行操作AD
- 如何利用C#代码来进行操作AD
- 利用C#事务处理对数据库进行多重操作
- WPF C#开发中利用SQLDMO进行数据库备份还原操作中的注意点
- C#利用SqlDataAdapte对DataTable进行批量数据操作
- 利用C#开发web应用程序时,对注册表进行操作提示没有权限的解决办法
- 利用C#事务处理对数据库进行多重操作
- 利用C#对远程服务进行操作
- c#利用反射Assembly 对类和成员属性进行操作
- C#对XML的操作,利用DataSet对XML进行操作。
- C#对XML的操作,利用DataSet对XML进行操作。
- [转载] 使用CPU时间戳进行高精度计时
- 利用Hibernate3.6.10进行CRUD操作