我找不到任何关于QueryPerformanceCounter()返回的64位值是否/何时被重置,或溢出并重置为零的明确指示。希望它永远不会溢出,因为64位提供了几十年的空间,以千兆赫兹的速率计数。但是......除了计算机重启之外还有什么东西可以重置它吗?
答案 0 :(得分:1)
根据经验,QPC在系统启动时重置。
请注意,不依赖于此行为,因为Microsoft没有明确说明QPC的“零点”是什么,只是它是一个单调递增的值(mod 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;
}
标准免责声明适用,您的实际里程可能会有所不同等等。
答案 1 :(得分:0)
似乎在VirtualBox中运行的某些Windows可能每20分钟左右重置一次QueryPerformanceCounter:see here。
QPC随着时间的推移更加可靠,但为了更好的便携性,应该使用低精度计时器,例如GetTickCount64。