Я не могу найти никаких четких указаний на то, если/когда 64-битное значение, возвращаемое QueryPerformanceCounter(), сбрасывается или переполняется и сбрасывается до нуля. Надеюсь, он никогда не переполнится, потому что 64 бита дают место для десятилетий подсчета с гигагерцовой скоростью. Однако ... есть ли что-нибудь, кроме перезагрузки компьютера, которое сбросит его?
Когда (если когда-либо) QueryPerformanceCounter() сбрасывается до нуля?
Ответы (2)
Опытным путем QPC сбрасывается при запуске системы.
Обратите внимание, что вы не должны не зависеть от этого поведения, поскольку Microsoft явно не указывает, что такое «нулевая точка» для QPC, а просто указывает, что это монотонно возрастающее значение (mod 2^64), которое может быть используется для высокоточного хронометража.
Следовательно, они имеют полное право изменить его поведение в любое время. Они могли бы, например, заставить его возвращать значения, которые соответствуют значениям FILETIME
, которые будут получены при вызове GetSystemTimeAsFileTime()
, с тем же разрешением и частотой тиков 100 нс. В этих условиях он никогда не будет сброшен. По крайней мере, ни в вашей, ни в моей жизни.
Тем не менее, следующая программа при запуске на 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;
}
Применяются стандартные заявления об отказе от ответственности, ваш фактический пробег может отличаться и т. д. и т. д. и т. д.
Кажется, что некоторые Windows, работающие внутри VirtualBox, могут сбрасывать QueryPerformanceCounter каждые 20 минут или около того: см. здесь а>.
QPC более надежен с течением времени, но для лучшей переносимости следует использовать таймер низкой точности, такой как GetTickCount64.