3

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

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

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

4

5 回答 5

7

我们更新了 QueryPerformanceCounter 的文档,上面 RDTSC 和 QueryPerformanceCounter 精度的比较不太对。如需更多信息,请参阅

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

埃德布里格斯微软公司

于 2014-02-20T20:48:25.440 回答
5

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

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

这就是它要说的:

参数

lpPerformanceCount [出]

类型:LARGE_INTEGER*

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

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

这就是它要说的:

参数

lpFrequency [输出]

类型:LARGE_INTEGER*

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

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

(counts) / (counts/second) = seconds

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

于 2012-07-06T02:02:46.317 回答
1

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

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

于 2012-07-06T02:17:44.983 回答
0

尽管 In silico 回答了这个问题,但如果您正在寻找更高的计时器分辨率,您可以使用rdtsc汇编指令。rdtsc比使用 CPU 时钟(与主板时钟相反)要QueryPerformanceCounter准确约 1000 倍。QueryPerformanceFrequency该方法看起来像这样:

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

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

于 2012-07-06T02:19:38.643 回答
0

Windows 7 引入了一种为QueryPerformanceCounter.

该函数被假定为具有最精细的粒度,但必须查看其准确性:返回的值QueryPerformanceFrequency既不是观察到的精确值,也不是常数。特别是较旧的系统会遭受严重的热漂移。

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

于 2012-07-31T14:27:16.547 回答