何时(如果有的话)QueryPerformanceCounter()重置为零?

时间:2013-02-27 01:22:40

标签: winapi timing

我找不到任何关于QueryPerformanceCounter()返回的64位值是否/何时被重置,或溢出并重置为零的明确指示。希望它永远不会溢出,因为64位提供了几十年的空间,以千兆赫兹的速率计数。但是......除了计算机重启之外还有什么东西可以重置它吗?

2 个答案:

答案 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