Есть и другие возможности.
QueryPerformanceCounter и QueryPerformanceFrequency
QueryPerformanceCounter вернет «счетчик производительности», который фактически является 64-разрядным счетчиком, управляемым ЦП, который увеличивается с 0, начиная с включения компьютера. Частота этого счетчика возвращается QueryPerformanceFrequency . Чтобы получить эталон времени в секундах , разделите счетчик производительности на частоту выполнения. В Delphi:
function QueryPerfCounterAsUS: int64;
begin
if QueryPerformanceCounter(Result) and
QueryPerformanceFrequency(perfFreq)
then
Result := Round(Result / perfFreq * 1000000);
else
Result := 0;
end;
На многопроцессорных платформах QueryPerformanceCounter должен возвращать согласованные результаты независимо от того, на каком процессоре в данный момент выполняется поток. Однако иногда возникают проблемы, обычно вызванные ошибками в аппаратных чипах или BIOS. Обычно патчи предоставляются производителями материнских плат. Два примера из MSDN:
Другая проблема с QueryPerformanceCounter заключается в том, что он работает довольно медленно.
инструкция RDTSC
Если вы можете ограничить свой код одним ЦП (SetThreadAffinity), вы можете использовать RDTSC инструкцию ассемблера для запроса счетчика производительности непосредственно из процессора.
function CPUGetTick: int64;
asm
dw 310Fh // rdtsc
end;
Результат RDTSC увеличивается с той же частотой, что и QueryPerformanceCounter. Разделите его на QueryPerformanceFrequency, чтобы получить время в секундах.
QueryPerformanceCounter намного медленнее, чем RDTSC, потому что он должен учитывать несколько процессоров и процессоров с переменной частотой. От Блог Раймона Чена :
(QueryPerformanceCounter) считает прошедшее время. Он должен, так как его значение
регулируется функцией QueryPerformanceFrequency, которая возвращает число
указав количество единиц в секунду, а частота указана как не
меняется во время работы системы.
Для процессоров, которые могут работать с переменной скоростью, это означает, что HAL не может
используйте инструкцию, подобную RDTSC, поскольку она не коррелирует с прошедшим временем.
timeGetTime
TimeGetTime относится к мультимедийным функциям Win32 Win32. Возвращает время в миллисекундах с разрешением 1 мс, по крайней мере, на современном оборудовании. Это не повредит, если вы запустите timeBeginPeriod (1) до того, как начнете измерять время и timeEndPeriod (1), когда закончите.
GetLocalTime и GetSystemTime
До Vista оба GetLocalTime и GetSystemTime возвращают текущее время с точностью до миллисекунды, но они не с точностью до миллисекунд. Их точность обычно находится в диапазоне от 10 до 55 миллисекунд. ( Точность не совпадает с точностью )
В Vista, GetLocalTime и GetSystemTime работают с разрешением 1 мс.