Среднее время выполнения - PullRequest
5 голосов
/ 22 сентября 2010

Есть ли хороший способ GNU, как измерить среднее (худшее, лучшее) время выполнения какой-либо программы командной строки? У меня есть фильтр изображений, неопределенное количество картинок, фильтрование их с помощью for-loop в bash. Пока я использую время , но я не могу найти способ получить статистику.

Ответы [ 5 ]

6 голосов
/ 22 сентября 2010

Вы можете отправить вывод времени в некоторый файл, а затем «обработать» этот файл

echo "some info" >> timefile.txt
time ( ./yourprog parm1 parm2 ) 2>> timefile.txt
4 голосов
/ 22 сентября 2010

Есть интересная Perl-программа под названием dumbbench , которая по сути является оболочкой для команды time. Он запускает вашу программу несколько раз, выбрасывает выбросы, а затем вычисляет некоторую статистику.

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

2 голосов
/ 22 сентября 2010
#!/bin/bash
for i in {1..100}
do
  env time --append -o time_output.txt   ./test_program --arguments-to-test-program
done
exit

Если вы обнаружите, что синтаксис {1..100} не работает для вас, вы должны взглянуть на команду seq.

Я использовал env time для выполнениявременная программа, а не встроенная команда оболочки, которая не принимает все аргументы, которые принимает временная программа.Временная программа также использует другие аргументы, чтобы изменить формат ее вывода, который вы, вероятно, захотите использовать для облегчения обработки данных другой программой.Аргумент -p (--portability) выводит его в формате POSIX (как встроенное время BASH), но с помощью опции -f вы можете получить больше контроля.man 1 time для получения дополнительной информации.

После того, как вы собрали свои данные, простой скрипт на Perl или Python может легко проанализировать и проанализировать ваши временные данные.

2 голосов
/ 22 сентября 2010

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

Затем я использую python для сбора статистики, читая вывод time. Чтобы повысить точность, я обычно делаю пробную версию 10 - 1000 раз, в зависимости от того, сколько времени занимает каждый процесс.

Я не знаком ни с одним предустановленным приложением GNU, которое выполняет такой анализ.

0 голосов
/ 22 сентября 2010

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

time for i in {1..1000}
do
    something
done

Вы можете записать вывод времени в переменную :

foo=$( { time {
    echo "stdout test message demo"
    for i in {1..30}
    do
        something
    done
    echo "stderr test message demo" >&2
} 1>&3 2>&4; } 2>&1 )

и немного фальшивой математики :

foo=${foo/.}          # "divide" by ...
echo "0.00${foo/#0}"  # ... 1000

Или просто используйте bc:

echo "scale=8; $foo/1000" | bc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...