2012-07-06 77 views
2

这似乎是一个很基本的问题,但,当除以windows高性能计数器的分辨率是多少?

QueryPerformanceCounterQueryPerformanceFrequency输出,什么是所产生的价值,即秒,毫秒,微秒?

我在问,因为我将一些代码从Windows移植到Linux,我没有一个方便试验的Windows机器。一些Google搜索功能并没有为我提供具体的答案。

回答

4

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

为 “QueryPerformanceCounter的”

首先谷歌搜索结果:MSDN文档QueryPerformanceCounter()

下面是它说:

参数

lpPerformanceCount [出]

类型:LARGE_INTEGER *

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

为 “QueryPerformanceFrequency的”

首先谷歌搜索结果:MSDN文档QueryPerformanceFrequency()

下面是它说:

参数

lpFrequency [出]

类型:LARGE_INTEGER *

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

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

(counts)/(counts/second) = seconds 

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

+0

感谢。我一定错过了那部分! – Matt 2012-07-06 02:08:18

+0

然而,这并不意味着分数的结果值以整秒表示。高性能计数器允许您实现精度小于秒的计数器。假设'QFF()'返回100,你可以调用'QFC()'并获得每秒100次的不同值。 – 2012-07-06 02:16:22

+0

这是我很好奇的整数部分。 – Matt 2012-07-06 02:28:02

1

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

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

0

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

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更容易由于较大的石英晶体。当然,您是否想要深入研究高分辨率时序的深度,都取决于您的应用程序中时序的重要性。快乐的编码!

+2

请阅读讨论'rdtsc'的[Game Timing and Multicore Processors](http://msdn.microsoft.com/zh-cn/library/ee417693%28v=vs.85%29.aspx)。 – 2012-07-06 02:24:47

+0

谢谢,我正在使用clock_gettime(CLOCK_MONOTONIC ...)来达到我的目的。 – Matt 2012-07-06 02:29:13

+0

该指令有可能被禁用... – Jay 2013-04-12 05:15:32

0

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

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

我写了一些更多的细节here