WEB开发网
开发学院软件开发VC 一个连续更新,高精度的时间供应器 阅读

一个连续更新,高精度的时间供应器

 2006-07-20 11:38:26 来源:WEB开发网   
核心提示: 我在本文前面曾提到,调用 QueryPerformanceCounter 的代价是不能忽略的,一个连续更新,高精度的时间供应器(9),对于单处理器系统尤其如此,使用性能计数器API 调用的执行时间在对称多处理系统上(SMP)通常要快得多,n2,两次数值的差值通过f换算成时间间隔,这是因为大

我在本文前面曾提到,调用 QueryPerformanceCounter 的代价是不能忽略的,对于单处理器系统尤其如此。使用性能计数器API 调用的执行时间在对称多处理系统上(SMP)通常要快得多。这是因为大多数对称多处理系统的性能计数器中都实现了奔腾时戳计数器(time stamp counter, TSC),与单处理器系统实现比较调用开销相对较低。

对于性能我稍微有点失望,即便没有努力去优化计算。为了获得较好的性能而丧失了可移植性,你可能尝试使用其它计数器。time_provider 类在计数器类型上是参数化的,可用于其它高精度计数器。下载的源代码中还有另外一个实验类 tsc_counter ,可以直接使用奔腾 TSC 。对这个类的初步测试表明:它比使用性能计数器 API 有好得多的性能,甚至是(比性能计数器)在SMP机器上。当进行与 Figure 9 中同样的测试时,tsc_counter 版本的时间供应器时钟在 33%(文件时间),133%(系统时间)和 5.9%(原始时间)。 

未来方向

当前的实现还有许多潜在的问题——鉴于问题的复杂性,对此不要感到惊讶。由于硬件兼容性所引起的问题,该代码不可以用在任何可获得的系统上,比如省电,CPU 超频以及非持续性计数器。如果在这些条件下你找到办法使这个供应器更可靠,请让我知道。在决定使用该代码之前你应该知道你的硬件平台。

为 .NET 和 COM 进行包装肯定是可行的,允许时间供应器在除了C++语言之外语言中使用。实际上我已经实现了一个作为 COM 进程内服务器的时间供应器。 

结论

如果你现在认为你可以获得几乎任意精度的系统时间,给一个小警告:不要忘记像 Windows NT 这样的抢先式多任务系统,最好的情况下,你获得的时戳仅仅是读取性能计数器所花时间并将所读内容转化为绝对时间的时间差。最坏的情况下,时间流失会很容易地达到数十毫秒之多。

尽管这有可能预示着你所作的一切都毫无用处,但同时也不见得真的就如此。即使执行对 Win32 API GetSystemTimeAsFileTime (或者 Unix 下的 gettimeofday)的调用也受制于同样的条件,所以你实际做的不会比那更遭。在大多数情况下,你会得到好的结果。只是不要对基于 Windows NT 的时间戳有任何实质性的预言。 

背景知识

  • 时间函数(Time Functions) :Inside Windows 2000,第三版,作者 David Solomon 和 Mark Russionvich(Microsoft Press, 2000)
  • 性能计数器值可能会意外地向前跳跃(Performance Counter Value May Unexpectedly Leap Forward)

结束语

性能计数器(Performance Counter)的一些介绍:

在一些计算机硬件系统中,包含有高精度运行计数器,利用它可以获得高精度定时间隔,其精度与 CPU 的时钟频率有关。采用这种方法的步骤如下:

  • 1、首先调用 QueryPerformanceFrequency 函数取得高精度运行计数器的频率f。单位是每秒多少次(n/s),此数一般很大。
  • 2、在需要定时的代码的两端分别调用 QueryPerformanceCounter 以取得高精度运行计数器的数值n1,n2。两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f。

上一页  4 5 6 7 8 9 

Tags:一个 连续 更新

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接