Как интерпретировать время тестов, указанное в модуле Benchmark Perl?

Резюме

Когда я выполняю очень простую программу с помощью утилиты Perl Benchmark. Я получаю значения, которые не (отображаются как) миллисекунды или наносекунды. Возвращенные данные тестов бесполезны для меня, потому что я не знаю, как их интерпретировать.

Пример:

use Benchmark;

my $start = Benchmark->new;
print "foo!";
my $end = Benchmark->new;

my $diff = timediff($end, $start);

print timestr($diff);

Возврат: foo! 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)

Что означают разные поля: Wallclock seconds, Usr, Sys, CPU? Можно ли их экстраполировать, чтобы получить значение в миллисекундах? Прямо сейчас для моего тестирования все, что мне нужно, это реальное время для одного выполнения, без необходимости учитывать некоторые из более эзотерических аспектов тестов.


person Elijah    schedule 23.09.2010    source источник
comment
Вы действительно, действительно хотите использовать Benchmark ': hireswallclock' или вообще избегайте использования модуля таким образом. Настенные часы - это ваше реальное время. Попробуйте протестировать фрагменты кода с макроскопическим временем выполнения. Если это невозможно, потому что дополнительный цикл слишком сильно исказит результат, тогда вы оптимизируете микро-оптимизацию, и мы все знаем, что вам не следует этого делать.   -  person tsee    schedule 23.09.2010
comment
Выполнение чего-либо только один раз не даст вам хорошего результата. Вам нужно запускать свою операцию тысячи раз, чтобы получить реальные (усредненные) данные, которые будут полезны.   -  person Ether    schedule 23.09.2010


Ответы (1)


Секунды настенных часов - это фактическое истекшее время, как если бы вы смотрели на часы, чтобы отсчитать время.

USR-секунды во времени, фактически затраченном на CPU, в пространстве пользователя.

Системные секунды - это время, фактически затраченное на процессор в пространстве ядра.

Процессорное время - это общее время, потраченное на CPU.

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

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

Я довольно подробно разбираюсь в этом в Освоении Perl и в некоторых своих выступлениях по тестированию производительности. Однако я думаю, что буквально на этой неделе модуль Benchmark устарел. Dumbbench Штеффена Мюллера справляется гораздо лучше. См. Записи в его блоге dumbbench по адресу blogs.perl.org.

person brian d foy    schedule 23.09.2010
comment
Я бы с осторожностью сказал, что Benchmark.pm устарел. Он делает то, что рекламирует, даже если интерфейс ... интересный. Сама цель Dumbbench - получить некоторый контроль со стороны пользователя, чтобы уменьшить вероятность неправильного понимания статистики EBKAC. Это приводит к необходимости выполнять больше итераций долго выполняемых команд, чем необходимо, если вы просто заботитесь о ожидаемом значении. - person tsee; 23.09.2010
comment
Бенчмарк мне никогда особо не нравился. Я с нетерпением жду того дня, когда это не тот инструмент, который мы используем. :) - person brian d foy; 23.09.2010