Когда (если когда-либо) QueryPerformanceCounter() сбрасывается до нуля?

Я не могу найти никаких четких указаний на то, если/когда 64-битное значение, возвращаемое QueryPerformanceCounter(), сбрасывается или переполняется и сбрасывается до нуля. Надеюсь, он никогда не переполнится, потому что 64 бита дают место для десятилетий подсчета с гигагерцовой скоростью. Однако ... есть ли что-нибудь, кроме перезагрузки компьютера, которое сбросит его?


person omatai    schedule 27.02.2013    source источник
comment
Не существует сценария, в котором вы когда-либо заботитесь об этом. Здесь можно задавать только практические вопросы.   -  person Hans Passant    schedule 27.02.2013
comment
Это немного высокомерно, конечно? Вы когда-нибудь слышали об устранении строк запроса?   -  person omatai    schedule 27.02.2013
comment
Конечно нет, вы не указали их в своем вопросе. Совершенно непонятно, какую проблему вы пытаетесь решить.   -  person Hans Passant    schedule 27.02.2013
comment
Это очень простой и понятный вопрос. Причина, по которой вы никогда не заботитесь об этом, по-видимому, заключается в том, что вы точно знаете, что QPC() ведет себя определенным образом в отношении сброса. Что ж, перестаньте критиковать вопрос и поделитесь этим определенным знанием, потому что его трудно найти. Сбрасывается ли QPC аппаратно? По ОС? Предоставляет ли он строго интерфейс только для чтения или существуют (недокументированные) способы сбросить счетчик и все испортить? И т.п.   -  person omatai    schedule 27.02.2013
comment
Не задокументировано, что счетчик может быть сброшен чем-либо, кроме подразумеваемого 64-битного переполнения. Если это не задокументировано, вы можете предположить, что оно этого не делает (потому что, если бы это было так, сломались бы самые разные вещи, потому что все остальные предполагают, что это не так).   -  person Jonathan Potter    schedule 27.02.2013
comment
Предполагая, что вы спрашиваете, потому что вы получаете странные результаты от QPC, можно было получить противоречивые результаты в зависимости от того, на каком процессоре выполнялся поток, выполняющий вызов (т.е. счетчик был согласован на каждом ядре, но не согласован между ядрами) . Также можно было получить ложные результаты в системах с разными тактовыми частотами процессора. Тем не менее, я не видел ни одной из этих проблем в последние годы. Если вы используете относительно новую версию Windows на относительно новом оборудовании, с QPC все будет в порядке.   -  person arx    schedule 27.02.2013
comment
Я получал странные результаты от кода, который использовал QPC, но в котором также происходили другие вещи. Я хотел исключить любой возможный сброс в QPC как возможную причину. Я искал сброс QPC и ноль QPC и не нашел абсолютно ничего, кроме вопросов без ответов - например, сбрасывает ли QPC в режиме ожидания или гибернации. Я думал, что это довольно простой вопрос, и я убедился, что в нем есть очевидные ключевые слова для поиска. Я просто поражен нежеланием кого-либо четко ответить на вопрос. Кто-нибудь хоть знает наверняка?   -  person omatai    schedule 28.02.2013
comment
Тем не менее, я впоследствии нашел свою собственную ошибку в другом месте, поэтому я не жду ответа.   -  person omatai    schedule 28.02.2013


Ответы (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;
}

Применяются стандартные заявления об отказе от ответственности, ваш фактический пробег может отличаться и т. д. и т. д. и т. д.

person dgnuff    schedule 04.01.2018
comment
на момент написания этого комментария я сделал тест, и действительно похоже, что счетчик сбрасывается при запуске, потому что после перезагрузки значение меньше, чем значение до перезагрузки - person Robson; 26.09.2018

Кажется, что некоторые Windows, работающие внутри VirtualBox, могут сбрасывать QueryPerformanceCounter каждые 20 минут или около того: см. здесь.

QPC более надежен с течением времени, но для лучшей переносимости следует использовать таймер низкой точности, такой как GetTickCount64.

person felipegf    schedule 15.10.2013