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

Posted

技术标签:

【中文标题】windows高性能计数器的分辨率是多少?【英文标题】:What is the resolution of windows high performance counter? 【发布时间】:2012-07-06 02:00:01 【问题描述】:

这似乎是一个非常基本的问题,但是,当划分输出时

QueryPerformanceCounterQueryPerformanceFrequency,结果值是多少,即秒、毫秒、微秒?

我之所以这么问,是因为我正在将一些代码从 Windows 移植到 Linux,而且我没有方便的 Windows 机器进行试验。一些谷歌搜索没有为我提供具体的答案。

【问题讨论】:

【参考方案1】:

我们更新了 QueryPerformanceCounter 的文档,上面 RDTSC 和 QueryPerformanceCounter 准确性的比较不太正确。如需更多信息,请参阅

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

埃德·布里格斯 微软公司

【讨论】:

【参考方案2】:

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

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

这就是它要说的:

参数

lpPerformanceCount [out]

类型:LARGE_INTEGER*

指向一个变量的指针,该变量接收 当前性能计数器值,计数

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

这就是它要说的:

参数

lpFrequency [out]

类型:LARGE_INTEGER*

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

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

(counts) / (counts/second) = seconds

因此,两个值相除的结果是以秒为单位的。

【讨论】:

谢谢。我一定错过了那部分! 然而,这并不意味着除法的结果值以整秒表示。高性能计数器允许您以小于秒的精度实现计数器。假设 QFF() 返回 100,您将能够调用 QFC() 并获得不同的值,最多每秒 100 次。 这是我很好奇的整数部分。 小心使用计数器,如果计数器不计数,您将得到不正确的结果!!!看我的回答!【参考方案3】:

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

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

【讨论】:

【参考方案4】:

尽管 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 的影响。当然,您是否想深入研究高分辨率时序,完全取决于时序在您的应用中的重要性。编码愉快!

【讨论】:

请阅读Game Timing and Multicore Processors,其中谈到了rdtsc 谢谢,我正在使用 clock_gettime(CLOCK_MONOTONIC... ) 来达到我的目的。 我不同意。支持 QPF/QPC 的驱动程序同样可以使用 RDTSC。在我的机器上,QPF 返回 2.9 GHz,这是我的 CPU 时钟。 QPC/QPF 与 RDTSC 一样有效但更便携,除非您的系统没有安装驱动程序来使用 RDTSC 作为 QPC/QPF 源。【参考方案5】:

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

这个函数被认为是最细粒度的,但它的准确性必须被观察:QueryPerformanceFrequency 返回的值既不是观察到的,也不是一个常数。特别是较旧的系统会遭受严重的热漂移。

我已经写了更多细节here。

【讨论】:

以上是关于windows高性能计数器的分辨率是多少?的主要内容,如果未能解决你的问题,请参考以下文章

NumberOfReclaimedConnections 性能计数器的可接受值是多少?

windows下基于(QPC)实现的微秒级延时

如何检索“平均值”性能计数器?

PowerBI分析Windows性能计数器的数据

我可以在性能监视器中使用哪个计数器来查看有多少内存在等待 GC?

Windows性能计数器分析性能监视器的使用