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

时间:2012-07-06 02:00:02

标签: c++ windows

这似乎是一个非常基本的问题,但是,在划分

的输出时 带QueryPerformanceCounter

QueryPerformanceFrequency,得到的值是多少,即秒,毫秒,微秒?

我问,因为我正在将一些代码从Windows移植到Linux,而且我没有一台便于试验的Windows机器。一些谷歌搜索没有为我提供具体的答案。

5 个答案:

答案 0 :(得分:6)

我们更新了QueryPerformanceCounter的文档,上面的RDTSC和QueryPerformanceCounter准确性之间的比较并不完全正确。有关详细信息,请参阅

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

埃德布里格斯 微软公司

答案 1 :(得分:5)

  

一些谷歌搜索没有为我提供具体的答案。

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

的MSDN文档

以下是它的意思:

  

<强>参数

     

lpPerformanceCount [out]

     

输入: LARGE_INTEGER *

     

指向接收变量的变量的指针   当前绩效 - 计数器值,计数

“QueryPerformanceFrequency”的首次Google搜索结果:QueryPerformanceFrequency()

的MSDN文档

以下是它的意思:

  

<强>参数

     

lpFrequency [out]

     

输入: LARGE_INTEGER *

     

指向变量的指针   接收当前的性能计数器频率,的计数   第二即可。如果安装的硬件不支持高分辨率   性能计数器,此参数可以为零。

QueryPerformanceCounter()获得的值是计数。从QueryPerformanceFrequency()获得的值是每秒计数。使用一些维度分析:

(counts) / (counts/second) = seconds

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

即使In silico回答了这个问题,如果您正在寻找更高的计时器分辨率,您也可以使用rdtsc汇编指令。 rdtscQueryPerformanceCounterQueryPerformanceFrequency精确约1000倍,因为它使用CPU时钟(而不是主板时钟)。该方法看起来像这样:

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
 }
}

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

答案 4 :(得分:0)

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

假设此函数具有最精细的粒度,但必须考虑其准确性:QueryPerformanceFrequency返回的值既不是观察到的值也不是常量。特别是旧系统遭受严重的热漂移。

我已经写了更多详情here