Нет, они не обладают точностью до миллисекунды. clock
и GetTickCount
имеют точность от 4 до 15 миллисекунд в большинстве систем. QueryPerformanceCounter
имеет точность в диапазоне от микросекунд до наносекунд.
clock
- это оболочка для GetTickCount
, если вы используете библиотеку времени выполнения Microsoft C, что, если вы используете компилятор MS, вероятно, так и есть. GetTickCount
возвращает значение в миллисекундах, но оно не увеличивается на одну миллисекунду по истечении одной миллисекунды. Он увеличивается только тогда, когда происходит прерывание системных часов, которое составляет каждые четыре-15 миллисекунд - обычно это около 15 мс, но оно может быть изменено приложениями. Это влияет на весь компьютер: это влияет на планирование потоков, а накладные расходы на более частые прерывания также оставляют меньше процессорного времени для фактического выполнения программного кода, поэтому не делайте этого, если вам это действительно не нужно. Если ваш компьютер тикает чаще 15 мс, другое приложение изменило частоту прерывания тика.
QueryPerformanceCounter
использует все доступные в системе таймеры высокого разрешения. В прошлом он обычно основывался на внутреннем подсчете тактов процессора, поэтому считал при частоте 2-3 ГГц или около 0,5 нс. К сожалению, некоторые процессоры изменяли частоту, с которой будет работать счетчик, когда они находятся в состояниях с низким энергопотреблением, и в многопроцессорных системах (то есть с несколькими сокетами процессора) у вас возникнут проблемы, если у процессоров будет разная скорость. В настоящее время Windows использует другие более надежные источники, но они не настолько высокого разрешения, как процессор. QueryPerformanceFrequency
говорит вам, сколько тиков происходит за одну секунду. Чтобы получить миллисекунды, умножьте разность выборок QPC на 1000 и разделите на результат QueryPerformanceFrequency
.