Какой самый точный способ измерения прошедшего времени в современном ПК? - PullRequest
2 голосов
/ 01 октября 2010

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

Спасибо.

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

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

«Точность» и «точность» означают разные вещи.«Окружность Земли 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).

1 голос
/ 01 октября 2010

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

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

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


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

...