В чем разница между clock (), gettickcount (), QueryPerformanceCounter () и QueryPerformanceFrequency ()? - PullRequest
5 голосов
/ 13 октября 2009

Все они дают разрешение в миллисекундах?

Ответы [ 2 ]

8 голосов
/ 01 марта 2011

Нет, они не обладают точностью до миллисекунды. clock и GetTickCount имеют точность от 4 до 15 миллисекунд в большинстве систем. QueryPerformanceCounter имеет точность в диапазоне от микросекунд до наносекунд.

clock - это оболочка для GetTickCount, если вы используете библиотеку времени выполнения Microsoft C, что, если вы используете компилятор MS, вероятно, так и есть. GetTickCount возвращает значение в миллисекундах, но оно не увеличивается на одну миллисекунду по истечении одной миллисекунды. Он увеличивается только тогда, когда происходит прерывание системных часов, которое составляет каждые четыре-15 миллисекунд - обычно это около 15 мс, но оно может быть изменено приложениями. Это влияет на весь компьютер: это влияет на планирование потоков, а накладные расходы на более частые прерывания также оставляют меньше процессорного времени для фактического выполнения программного кода, поэтому не делайте этого, если вам это действительно не нужно. Если ваш компьютер тикает чаще 15 мс, другое приложение изменило частоту прерывания тика.

QueryPerformanceCounter использует все доступные в системе таймеры высокого разрешения. В прошлом он обычно основывался на внутреннем подсчете тактов процессора, поэтому считал при частоте 2-3 ГГц или около 0,5 нс. К сожалению, некоторые процессоры изменяли частоту, с которой будет работать счетчик, когда они находятся в состояниях с низким энергопотреблением, и в многопроцессорных системах (то есть с несколькими сокетами процессора) у вас возникнут проблемы, если у процессоров будет разная скорость. В настоящее время Windows использует другие более надежные источники, но они не настолько высокого разрешения, как процессор. QueryPerformanceFrequency говорит вам, сколько тиков происходит за одну секунду. Чтобы получить миллисекунды, умножьте разность выборок QPC на 1000 и разделите на результат QueryPerformanceFrequency.

3 голосов
/ 13 октября 2009

clock

Функция C ++. Возвращает количество тактов процессора с момента запуска приложения. Чтобы преобразовать это в секунды, разделите это на CLOCKS_PER_SEC.

GetTickCount

Функция Win32 API. Возвращает число миллисекунд с момента запуска системы.

QueryPerformanceCounter

Функция Win32 API. Счетчик производительности - это счетчик высокого разрешения , который увеличивается со временем. Чтобы преобразовать это в секунды, разделите это на QueryPerformanceFrequency.

...