windows高性能计数器的分辨率是多less?

这可能看起来像一个非常基本的问题,但是,当分割输出

QueryPerformanceCounter QueryPerformanceFrequency ,结果是什么值,即秒,毫秒,微秒?

我问,因为我将一些代码从Windows移植到Linux,我没有一个方便实验的Windows机器。 一些使用Googlesearchfunction并没有为我提供具体的答案。

一些使用Google搜索功能并没有为我提供具体的答案。

“QueryPerformanceCounter”的首个Google搜索结果: QueryPerformanceCounter()的MSDN文档

以下是它的说法:

参数

lpPerformanceCount [out]

类型: LARGE_INTEGER *

指向接收当前性能计数器值的变量的指针(以计数为单位)

“QueryPerformanceFrequency”的第一个Google搜索结果: QueryPerformanceFrequency()的MSDN文档

以下是它的说法:

参数

lpFrequency [out]

类型: LARGE_INTEGER *

指向一个变量的指针, 以每秒计数的形式接收当前的性能计数器频率。 如果安装的硬件不支持高分辨率性能计数器,则此参数可以为零。

QueryPerformanceCounter()获得的值是计数。 从QueryPerformanceFrequency()获得的值以每秒计数为单位。 使用一些尺寸分析:

 (counts) / (counts/second) = seconds 

因此,将这两个值分开的结果是以秒为单位的。

我们已经更新了QueryPerformanceCounter的文档,上面的RDTSC和QueryPerformanceCounter准确性之间的比较是不正确的。 欲了解更多信息,请参阅

http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

埃德布里格斯微软公司

至少就我所知,QPF通常取决于两个来源之一。 至少在同一时间,大多数单处理器系统使用处理器的时间戳计数器寄存器,通过RDTSC指令访问。

多处理器系统(以及没有TSC寄存器的旧系统)通常使用主板上的1.024 MHz时钟。 在多处理器/多核系统中,处理器/内核的时间戳计数器可能不同步,所以时间戳计数器可能会给出相当无意义的结果(包括负时间段)。

即使在计算机上回答了这个问题,如果你正在寻找更高的定时器分辨率,你可以使用rdtsc汇编指令。 与使用CPU时钟(而不是主板时钟)相比, rdtscQueryPerformanceCounterQueryPerformanceFrequency更精确。 该方法看起来像这样:

 void QueryRDTSC(__int64* tick) { __asm { xor eax, eax cpuid rdtsc mov edi, dword ptr tick mov dword ptr [edi], eax mov dword ptr [edi+4], edx } } 

有趣的是 :由于较大的石英晶体,较慢的主板时钟也更易受时钟漂移的影响。 当然,是否要深入研究高分辨率时序的深度取决于您的应用程序中时序的重要性。 快乐的编码!

Windows 7引入了一种为QueryPerformanceCounter生成结果的新方法。

这个函数被认为是尽可能细粒度的,但是它的准确性要看: QueryPerformanceFrequency返回的值既不是正确的,也不是一个常量。 特殊的旧系统遭受严重的热漂移。

我在这里写了更多的细节。