Иногда, а точнее почти всегда, необходимо замерять время выполнения некоторых участков кода. Для этого есть удобное и весьма точное средство — QueryPerformanceCounter. Однако при его использовании необходимы некоторые преобразования, чтобы получить результат в секундах.
Чтобы каждый раз не ковыряться с реализацией такого таймера, и уж тем более не вставлять повсеместно эти одинаковые преобразования в программе, я написал и использую следующий очень простой и удобный класс:
>> Мизраэль Постоялец >> Я бы для замера скорости выполнения участков кода всё же rdtsc использовал. Плюс привязку потока к процессору.
Скорее всего QueryPerformanceFrequency "внутри" использует rdtsc.
ElWray > Скорее всего QueryPerformanceFrequency "внутри" использует rdtsc.
Скорее всего http://en.wikipedia.org/wiki/High_Precision_Event_Timer но вообще любой высокочастотный таймер (даже GetTickCount, если ничего лучше нет)
NULL_PTR
Там написано, что это неправда.
>По их мнению, счетчик тиков съезжает скачками (что видно в тестовом приложении) из-за багов (!?) в некоторых чипсетах. >... счетчик работает неверно, потому что современные процессоры могут менять свою частоту на лету, чтобы экономить энергию. Особенно это актуально для ноутбуков.
Меня эта статья напугала в своё время.
GluKoBug
Ну это мнение какого-то левого чувака (который раскрыл заговор, не иначе!), как-то МС посолидней будет.
QPC не обязан быть завязан на такты процессора, да и тот же rdtsc как не странно, не меняет свою частоту в Core 2 Duo процессорах при смене частоты, так что тот факт, что какие-то процы/чипсеты, которые не соответствуют требованиям QPC, но при этом сообщяют системе "посмотрите, я нормальный высокочастотный таймер, положитесь на меня!!1" - это баг и проблемы кривых процов/чипсетов.
NULL_PTR > это баг и проблемы кривых процов/чипсетов
trollface.jpg нигде в MSDN не сказано ни о каких гарантиях QPC, нет ни одного стандарта на это дело, поэтому тот кто на это полагается криворукий разработчик, не иначе.
QueryPerformanceFrequency Function: The frequency cannot change while the system is running.
QueryPerformanceCounter Function: On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
NULL_PTR > QueryPerformanceFrequency Function: The frequency cannot change while the system is running.
Ну это про QueryPerformanceFrequency а не про сам таймер, так что не надо тут троллить.