Как получить текущее общесистемное разрешение таймера Windows
Я знаю, что по умолчанию установлено значение 15,6 мс на тик, но какой-то проигравший может изменить его, а затем снова и снова менять его, снова и снова, и мне нужно опросить текущее значение для выполнения действительной синхронизации QueryPerformanceCounter.
Так есть ли API способ получить разрешение таймера?
Я на C++ Кстати.
4 ответа
Разрешение таймера Windows обеспечивается скрытым вызовом API:
NTSTATUS NtQueryTimerResolution(OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG ActualResolution);
NtQueryTimerResolution экспортируется родной библиотекой Windows NT NTDLL.DLL.
Общие аппаратные платформы сообщают 156 250 или 100144 для ActualResolution; старые платформы могут сообщать о еще больших числах; более новые системы, особенно когда поддерживается HPET (высокоточный таймер событий) или постоянный / инвариантный TSC, могут вернуть 156 001 для ActualResolution.
Звонки в timeBeginPeriod(n)
отражены в ActualResolution.
Подробнее в этом ответе.
Это не поможет, другой процесс может изменить его во время калибровки.
Это относится к категории "если вы не можете победить их, присоединяйтесь к ним". Вызов timeBeginPeriod(1)
прежде чем начать калибровку. Это гарантирует, что у вас есть известный уровень, который никто не может изменить. Получение улучшенной точности таймера, безусловно, тоже не повредит.
Обратите внимание, что это маловероятно, что вы можете сделать лучше, чем QueryPerformanceFrequency(). Если вы не выполняете калибровку в течение очень долгого времени, тактовая частота просто недостаточно высока, чтобы дать вам дополнительную точность, поскольку вы никогда не сможете измерить лучше, чем +/- 0,5 мсек. И событие таймера не доставляется с точностью до миллисекунды, оно может быть произвольно задержано. Если вы проводите калибровку в течение длительных периодов, тогда GetTickCount64() достаточно хорош.
Инструкция RDTSC может использоваться для считывания счетчика меток времени CPU. В большинстве случаев (если не во всех) этот счетчик будет меняться с тактовой частотой процессора. Если вы хотите быть разборчивым, вы также можете использовать такую инструкцию, как CPUID, для сериализации команд. Обратитесь к руководствам Intel для получения более подробной информации.
Вы можете работать с RDTSC против таких API, как QueryPerformanceCounter и др. Другими словами, используйте RDTSC до и после вызова для проведения измерений.