При тестировании, что вызывает разрыв между временем процессора и «истекшим временем реального времени»? - PullRequest
2 голосов
/ 21 марта 2009

Я использую встроенный модуль тестирования для некоторых быстрых и грязных тестов. Это дает мне:

  • процессорное время
  • системное время процессора (фактически я никогда не получаю никакого результата для этого с кодом, который я запускаю)
  • сумма времени процессора пользователя и системы (в моем случае всегда совпадает с временем процессора)
  • прошедшее реальное время

Я даже не знал, что мне нужна вся эта информация.

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

Есть идеи, на какую метрику мне следует обратить внимание?

И, самое главное, мог бы кто-нибудь объяснить, почему «истекшее реальное время» всегда дольше, чем время ЦП - что вызывает задержку между ними?

Ответы [ 4 ]

10 голосов
/ 21 марта 2009

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

Пример, если ваш процесс:

  • использовал процессор в течение одной секунды выполнения вашего кода; то
  • использовал процессор в течение одной секунды, работая с кодом ядра ОС; то
  • менялся на семь секунд, пока выполнялся другой процесс; то
  • использовал процессор еще одну секунду для запуска вашего кода,

вы бы видели:

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

Вам нужно беспокоиться о трех секундах, поскольку эти десять секунд полностью зависят от капризов процесса планирования.

5 голосов
/ 21 марта 2009

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

3 голосов
/ 21 марта 2009

Вы не хотите полностью сбрасывать со счетов время на стене. Время ожидания без другого потока, готового к использованию циклов ЦП, может сделать один фрагмент кода менее желательным, чем другой. Один набор кода может занять больше процессорного времени, но использовать многопоточность, чтобы доминировать над другим кодом в реальном мире. Зависит от требований и специфики. Суть в том, что ... используйте все доступные вам метрики для принятия решения.

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

2 голосов
/ 21 марта 2009

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

Крайним примером является система реального времени, где таймер запускает некоторую активность, которая всегда короче, чем отметка таймера. Тогда время ЦП для этой операции никогда не будет подсчитано (в зависимости от того, как ОС ведет учет).

...