这似乎是一个很基本的问题,但,当除以windows高性能计数器的分辨率是多少?
QueryPerformanceCounter
与QueryPerformanceFrequency
输出,什么是所产生的价值,即秒,毫秒,微秒?
我在问,因为我将一些代码从Windows移植到Linux,我没有一个方便试验的Windows机器。一些Google搜索功能并没有为我提供具体的答案。
这似乎是一个很基本的问题,但,当除以windows高性能计数器的分辨率是多少?
QueryPerformanceCounter
与QueryPerformanceFrequency
输出,什么是所产生的价值,即秒,毫秒,微秒?
我在问,因为我将一些代码从Windows移植到Linux,我没有一个方便试验的Windows机器。一些Google搜索功能并没有为我提供具体的答案。
为 “QueryPerformanceCounter的”一些使用Google搜索功能并没有为我提供具体的答案。
首先谷歌搜索结果:MSDN文档QueryPerformanceCounter()
下面是它说:
为 “QueryPerformanceFrequency的”参数
lpPerformanceCount [出]
类型:LARGE_INTEGER *
指向一个变量,其接收在计数的 当前性能计数器值,。
首先谷歌搜索结果:MSDN文档QueryPerformanceFrequency()
下面是它说:
参数
lpFrequency [出]
类型:LARGE_INTEGER *
的指针,该接收 每 第二当前性能计数器频率,在计数的变量。如果安装的硬件不支持高分辨率 性能计数器,则此参数可以为零。
从QueryPerformanceCounter()
获得的值为计数。从QueryPerformanceFrequency()
获得的值以每秒计数为单位。使用一点尺寸分析:
(counts)/(counts/second) = seconds
因此,除以两个值的结果是以秒为单位。
至少据我所知,QPF通常取决于两个来源之一。至少在同一时间,大多数单处理器系统使用处理器的时间戳计数器寄存器,通过RDTSC指令访问。
多处理器系统(以及没有TSC寄存器的旧系统)通常使用主板上的1.024 MHz时钟。在多处理器/多核系统上,处理器/内核的时间戳计数器可能不同步,所以时间戳计数器可能会给出相当无意义的结果(包括负时间段)。
即使在计算机上回答了这个问题,如果您正在寻找更高的定时器分辨率,您可以使用rdtsc
汇编指令。因为它使用CPU时钟(与主板时钟相反),因此rdtsc
比QueryPerformanceCounter
和QueryPerformanceFrequency
更精确约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更容易由于较大的石英晶体。当然,您是否想要深入研究高分辨率时序的深度,都取决于您的应用程序中时序的重要性。快乐的编码!
Windows 7引入了一种为QueryPerformanceCounter
生成结果的新方法。
这个函数被认为是尽可能精细的粒度,但它的准确性要看:QueryPerformanceFrequency
返回的值既不是观察到的,也不是常数。特殊的旧系统遭受严重的热漂移。
我写了一些更多的细节here。
我们更新了QueryPerformanceCounter的文档,上面的RDTSC和QueryPerformanceCounter准确性的比较并不完全正确。欲了解更多信息,请参阅
http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
埃德·布里格斯 微软公司
感谢。我一定错过了那部分! – Matt 2012-07-06 02:08:18
然而,这并不意味着分数的结果值以整秒表示。高性能计数器允许您实现精度小于秒的计数器。假设'QFF()'返回100,你可以调用'QFC()'并获得每秒100次的不同值。 – 2012-07-06 02:16:22
这是我很好奇的整数部分。 – Matt 2012-07-06 02:28:02