2

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

4

2 回答 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 回答