Микросекундный точный (или лучший) процесс синхронизации в Linux

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

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

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

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

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

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

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


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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Думаю, я нашел исправление ядра, которое искал. Проводя его здесь, поэтому я не забываю ссылку:

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

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

Ответ 8

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