我找不到任何明确的指示是否/何时 QueryPerformanceCounter() 返回的 64 位值被重置,或者溢出并重置回零。希望它永远不会溢出,因为 64 位为数十年的千兆赫速率计算提供了空间。但是...除了重新启动计算机之外,还有什么可以重置它的吗?
问问题
959 次
2 回答
1
根据经验,QPC 在系统启动时被重置。
请注意,您不应依赖此行为,因为 Microsoft 没有明确说明 QPC 的“零点”是什么,只是说它是一个单调递增的值(模 2^64),可用于高精度计时。
因此,他们完全有权随时修改其行为。例如,它们可以使其返回与FILETIME
调用产生的值相匹配的值GetSystemTimeAsFileTime()
,具有相同的分辨率,100ns 滴答率。在这种情况下,它永远不会重置。至少在你或我的有生之年不会。
也就是说,以下程序在运行时Windows 10 [Version 6.3.16299]
会产生一对相同的值,它们是以秒为单位的系统正常运行时间。
#include <windows.h>
#include <iostream>
int main()
{
LARGE_INTEGER performanceCount;
LARGE_INTEGER performanceFrequency;
QueryPerformanceFrequency(&performanceFrequency);
for (;;)
{
QueryPerformanceCounter(&performanceCount);
DWORD const systemTicks = timeGetTime();
DWORD const systemSeconds = systemTicks / 1000;
__int64 const performanceSeconds = performanceCount.QuadPart / performanceFrequency.QuadPart;
std::cout << systemSeconds << " " << performanceSeconds << std::endl;
Sleep(1000);
}
return 0;
}
适用标准免责声明,您的实际里程可能会有所不同,等等等等。
于 2018-01-04T06:22:07.093 回答
0
似乎在 VirtualBox 中运行的某些 Windows 可能每 20 分钟左右重置一次 QueryPerformanceCounter:请参见此处。
随着时间的推移,QPC 更可靠,但为了更好的便携性,应该使用低精度计时器,例如GetTickCount64。
于 2013-10-15T19:02:47.340 回答