Какой самый точный способ измерения прошедшего времени на современном ПК?

Я знаю, что могу использовать IRQ0, то есть системный таймер, но он основан на тактовой частоте 14,31818 МГц, верно? Есть ли что-нибудь более точное?

Спасибо.

Изменить: кто-нибудь знает, что использует функция Windows QueryPerformanceCounter?


person FSD    schedule 30.09.2010    source источник
comment
На самом деле это 14,31818 МГц / 12 = 1,193181 МГц. Обратите внимание, что это мегагерцы, то есть миллионы циклов в секунду, какая точность вам нужна? Если вам не нужна прецизия, подобная TSC, может быть, достаточно HPET?   -  person ninjalj    schedule 01.10.2010
comment
Хм, я получаю противоречивую информацию. Некоторые источники говорят 14,31818 МГц, другие просто говорят о системных часах, а теперь вы говорите, что это 1,193181 МГц. Смущенный.   -  person FSD    schedule 01.10.2010
comment
dx.doi.org/10.1016/0745-7138(89)90029- 8 говорит о 1.19318 МГц.   -  person tc.    schedule 02.10.2010
comment
Вот ответ на вопрос о QueryPerformanceCounter.   -  person Seth    schedule 02.10.2010


Ответы (2)


«Точность» и «аккуратность» означают разные вещи. «Окружность Земли составляет 40000,000000000 км» - это точно, но неточно. С часами немного сложнее:

  • Разрешение: время между тиками или период тиков. (Вы, вероятно, могли бы назвать это «точностью», но я думаю, что «разрешение» имеет более очевидное значение.)
  • Перекос: относительная разница между номинальной и фактической тактовой частотой (ish)
  • Дрейф: скорость изменения перекоса (из-за старения, температуры и т. Д.).
  • Джиттер: случайное изменение времени тика.
  • Задержка: сколько времени требуется для получения отметки времени.

Хотя "системный таймер" (PIT согласно Википедии) работает на частоте 1 МГц, вы Обычно IRQ0 находится между 100 и 1000 Гц. По-видимому, вы также можете дважды читать с порта 0x40, чтобы получить текущее значение счетчика, но я не уверен, какая у этого задержка (а затем вы получаете количество отсчетов до следующего прерывания, поэтому вам нужно выполнить некоторую математику). Он также не работает на более современных ядрах без тиков.

Есть еще несколько высокочастотных таймеров:

  • Локальный APIC, который основан на частоте шины и делителе степени двойки. Я не могу найти никакой документации о том, как его читать (предположительно, это порт ввода-вывода?).
  • Таймер управления питанием ACPI (acpi_pm в Linux; я думаю, и флаг загрузки / UsePMTimer Windows), который составляет около 3,58 МГц согласно это. IIRC, читать это дороговато.
  • HPET, который по той же ссылке не менее 10 МГц (но может быть и выше). Он также должен иметь меньшую задержку, чем таймер ACPI PM.
  • TSC (с оговорками). Почти наверняка самая низкая задержка и, вероятно, самая высокая частота. (Но очевидно, что оно может увеличиваться более чем на 1 за каждый «тик», поэтому количество отсчетов в секунду не обязательно совпадает с разрешением.)

Дарвин (т.е. OS X), по-видимому, предполагает, что частота TSC не изменяется, и регулирует базовое значение, добавленное к ней, при пробуждении из состояния сна, когда TSC не работает (очевидно, C4 и выше). Существует другое базовое значение для каждого ЦП, потому что TSC не нужно синхронизировать между ЦП. Вы должны приложить разумные усилия, чтобы получить разумную временную метку.

IIRC, Linux просто выбирает один источник синхронизации (TSC, если он вменяемый, а затем HPET, а затем ACPI PM, я думаю).

IIRC, QueryPerformanceCounter () использует то, что Windows считает лучшим. Это также в некоторой степени зависит от версии Windows (XP предположительно не поддерживает HPET для прерываний, поэтому, по-видимому, не поддерживает и временные метки). Вы можете вызвать QueryPerformanceFrequency (), чтобы сделать предположение (я получаю 1995030000, что, вероятно, означает, что это TSC).

person tc.    schedule 02.10.2010

В процессорах Intel информация таймера высокой точности обычно доступна с помощью инструкции rdtsc.

Его точность намного выше, чем 14 МГц. Предостережение заключается в том, что у него могут быть проблемы с многоядерными процессорами и процессорами со степпингом.

Изменить: Этот вопрос содержит гораздо больше деталей. по этому поводу.


1. Фактическая частота зависит от процессора, но часто это частота процессора. Судя по всему, на процессорах Nehalem TSC работает на частоте фронтальной шины (133 МГц).

person Seth    schedule 30.09.2010
comment
IIRC, RDTSC существует со времен Pentium и используется как счетчик циклов. Разумно это или нет, сильно зависит от процессора; есть несколько флагов процессора для определения того, изменяется ли он с частотой процессора (в Linux, constant_tsc в / proc / cpuinfo), но даже с constant_tsc на него все равно могут влиять состояния сна. - person tc.; 02.10.2010
comment
@tc: также зависит от процессора, будет ли он синхронизирован между разными процессорами / ядрами. - person ninjalj; 02.10.2010