Синхронизация процесса с точностью в микросекунду (или лучше) в Linux

StackOverflow https://stackoverflow.com/questions/182554

Вопрос

Мне нужен очень точный способ определения времени выполнения частей моей программы.Я мог бы использовать для этого обычные часы с высоким разрешением, но это вернет время настенных часов, а это не то, что мне нужно:Мне нужно время, потраченное на запуск только моего процесса.

Я отчетливо помню, что видел патч для ядра Linux, который позволил бы мне синхронизировать мои процессы с точностью до наносекунды, за исключением того, что я забыл добавить его в закладки, а также забыл название патча :(.

Но я помню, как это работает:

При каждом переключении контекста он будет считывать значение часов с высоким разрешением и добавлять дельту последних двух значений ко времени выполнения запущенного процесса.Это позволяет получить точное представление о фактическом времени выполнения процесса с высоким разрешением.

Обычное время процесса поддерживается с использованием обычных часов, которые, я полагаю, имеют точность в миллисекунду (1000 Гц), что слишком велико для моих целей.

Кто-нибудь знает, о каком патче ядра я говорю?Я также помню, что это было что-то вроде слова с буквой перед или после него - что-то вроде "rtimer" или что-то в этом роде, но я точно не помню.

(Другие предложения тоже приветствуются)


Абсолютно честный планировщик, предложенный Марко, - это не то, что я искал, но он выглядит многообещающе.Проблема, с которой я сталкиваюсь, заключается в том, что вызовы, которые я могу использовать для получения времени процесса, по-прежнему не возвращают достаточно детализированные значения.

  • times() возвращает значения 21, 22 в миллисекундах.
  • clock() возвращает значения 21000, 22000 с одинаковой степенью детализации.
  • getrusage() возвращает значения типа 210002, 22001 (и тому подобное), они выглядят немного более точными, но значения выглядят явно одинаково.

Итак, теперь проблема, с которой я, вероятно, сталкиваюсь, заключается в том, что у ядра есть необходимая мне информация, я просто не знаю системный вызов, который вернет ее.

Это было полезно?

Решение

Если вы ищете такой уровень разрешения по времени, вы, вероятно, пытаетесь провести некоторую микрооптимизацию.Если это так, вам следует взглянуть на ПАПИ.Он не только предоставляет информацию о времени работы настенных часов и виртуальных (только для процесса), но и предоставляет доступ к счетчикам событий процессора, которые могут быть незаменимы, когда вы пытаетесь повысить производительность.

http://icl.cs.utk.edu/papi/

Другие советы

Видишь этот вопрос для получения дополнительной информации.

Кое-что, что я использовал для таких вещей, - это gettimeofday().Он обеспечивает структуру с секундами и микросекундами.Вызовите его перед кодом и еще раз после.Затем просто вычтите две структуры, используя timersub, и вы можете получить время, затраченное на это в секундах, из поля tv_usec.

Если вам нужны очень маленькие единицы времени для (я предполагаю) тестирования скорости вашего программного обеспечения, я бы порекомендовал просто запускать части, которые вы хотите синхронизировать, в цикле миллионы раз, учитывать время до и после цикла и вычислять среднее значение.Приятным побочным эффектом этого (помимо отсутствия необходимости выяснять, как использовать наносекунды) является то, что вы получите более согласованные результаты, потому что случайные накладные расходы, вызванные sceduler операционной системы, будут усреднены.

Конечно, если вашей программе не нужно запускать миллионы раз в секунду, она, вероятно, достаточно быстра, если вы не можете измерить время выполнения в миллисекунду.

Я считаю, что CFC (Абсолютно Честный Планировщик) - это то, что вы ищете.

Вы можете использовать высокоточный таймер событий (ВПЕТ) если у вас довольно свежее ядро 2.6.Проверьте Documentation/hpet.txt о том, как им пользоваться.Однако это решение зависит от платформы, и я считаю, что оно доступно только на более новых системах x86.HPET имеет таймер по крайней мере на 10 МГц, так что он должен легко соответствовать вашим требованиям.

Я полагаю, что несколько реализаций PowerPC от Freescale также поддерживают счетчик команд с точностью до цикла.Я использовал это несколько лет назад для профилирования высокооптимизированного кода, но я не могу вспомнить, как это называется.Я полагаю, что у Freescale есть исправление для ядра, которое вы должны применить, чтобы получить к нему доступ из пользовательского пространства.

http://allmybrain.com/2008/06/10/timing-cc-code-on-linux/

может быть вам полезно (непосредственно, если вы делаете это на C / C ++, но я надеюсь, что это даст вам подсказки, даже если вы этого не делаете)...Он утверждает, что обеспечивает микросекундную точность, которая как раз соответствует вашему критерию.:)

Я думаю, что нашел патч для ядра, который искал.Размещаю это здесь, чтобы я не забыл ссылку:

http://user.it.uu.se /~mikpe/linux/perfctr/ http://sourceforge.net/projects/perfctr/

Редактировать:Это работает для моих целей, хотя и не очень удобно в использовании.

попробуйте использовать процессор счетчик временных меток?Википедия, кажется, предлагает использовать clock_gettime() .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top