«Точность» и «точность» означают разные вещи.«Окружность Земли 40000,000000000 км» является точной, но не точной.С часами все немного сложнее:
- Разрешение: время между тиками или период тиков.(Вы, вероятно, могли бы назвать это «точностью», но я думаю, что «разрешение» имеет более очевидное значение.)
- Перекос: относительная разница между номинальной и фактической тактовой частотой (ish)
- Дрифт:скорость изменения асимметрии (из-за старения, температуры, ...).
- Джиттер: случайное изменение времени тиков.
- Латентность: Сколько времени занимает получение метки времени.
Несмотря на то, что «системный таймер» ( PIT согласно Википедии) работает на частоте 1. МГц, обычно вы получаете IRQ0 где-то между 100 и 1000 Гц. Очевидно, вы также можете дважды прочитать данные с порта 0x40, чтобы получить текущее значение счетчика, но я не уверен, какое значение имеет задержка (а затем вы получите количество импульсов до следующего прерывания, так что вынужно сделать математику).Он также не работает на более современных ядрах без галочек.
Есть несколько других высокочастотных таймеров:
- Локальный APIC, основанный на частоте шины иделитель степени 2.Хотя я не могу найти никакой документации о том, как его читать (предположительно, это порт ввода-вывода?).
- Таймер управления питанием ACPI (acpi_pm в Linux; я думаю, и / UsePMTimer флаг загрузки Windows), что составляет около 3,58 МГц согласно , это .IIRC, чтение его немного дороже.
- HPET, который составляет не менее 10 МГц по той же ссылке (но может быть и выше).Он также должен иметь меньшую задержку, чем таймер ACPI PM.
- TSC (с предупреждениями).Почти наверняка самая низкая задержка и, вероятно, самая высокая частота.(Но, очевидно, он может увеличиваться более чем на 1 за каждый «тик», поэтому число отсчетов в секунду не обязательно совпадает с разрешением.)
Дарвин (т.е. ОСX) , по-видимому, предполагает, что частота TSC не изменяется, и корректирует добавленное к ней базовое значение при выходе из состояния сна, когда TSC не работает (очевидно, C4 и выше).Существует различное базовое значение для каждого процессора, потому что нет необходимости синхронизировать TSC между процессорами.Вы должны приложить разумные усилия, чтобы получить разумную временную метку.
IIRC, Linux просто выбирает один источник синхронизации (TSC, если он нормальный, а затем HPET, а затем ACPI PM, я думаю).
IIRC, QueryPerformanceCounter () использует все, что Windows считает лучшим.Это также в некоторой степени зависит от версии Windows (предположительно, XP не поддерживает HPET для прерываний, поэтому, предположительно, она также не поддерживает временные метки).Вы можете вызвать QueryPerformanceFrequency (), чтобы сделать предположение (я получаю 1995030000, что, вероятно, означает, что это TSC).