Как усреднить время команд?

18

Я использую timeнекоторые из моих команд. Теперь, чтобы усреднить измерения, я хотел бы запускать и рассчитывать мои команды указанное количество раз и получать результаты с вычисленным средним и стандартным отклонением. Результат будет таким:

avgtime -n 100 my_command

real    0m5.388s stdev 0m0.068s
user    0m5.380s stdev 0m0.067s
sys     0m0.004s stdev 0m0.000s

Есть ли для этого инструмент UNIX? Есть ли у GNU / Linux такой?

Дидье Троссет
источник

Ответы:

7

Вы можете попробовать использовать модуль timeit, доступный в любой системе с Python:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop
bhdnx
источник
Использование os.system(), вызывает накладные расходы на вызов / создание оболочки с каждой командой. Вероятно, лучше использовать subprocess.call ()
Anthon
правда, но в любом случае, скорее всего, будет постоянным
bhdnx
4

Это не совсем UNIX или GNU / Linux инструмент, но вы вполне можете использовать программную среду R для статистических вычислений для этого. ( Хотя я не могу найти ничего более конкретного для вашей задачи .)

Edit Как я мог сомневаться, там, конечно , является эталоном для пакета R: rbenchmark. По-видимому, это обертки, system.time()которые вы также можете просто использовать напрямую. Или взгляните на это, простая пара функций секундомера. Также смотрите «Выполнение системной команды» @Rosetta Code (или нет, это так system("command").)

Edit2 Я только что увидел этот вопрос, «Измерение времени в скрипте» в правом столбце «Связанные», его тоже можно использовать, т. Е. Взять время, выполнить цикл for ( Nвремена), снова взять время, вычислить временной интервал, разделить на N, (Еще проще, попробуйте time ( for-loop ), разобрать его вывод, поделить на N).

Sr-
источник
3

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

Например, вы можете использовать время GNU для записи нескольких измерений времени выполнения в файл CSV:

function measure
{
  f=$1; shift
  n=$2; shift
  echo wall,user,sys,rss > "$f"
  for i in $(seq $n); do
    /usr/bin/time --output "$f" --append --format '%e,%U,%S,%M' "$@" >/dev/null
  done
}

Затем вы можете сгенерировать значения с помощью R следующим образом:

Rscript --vanilla -e "b=read.csv(file='$f');summary(b);sapply(b, sd);"

Я создал небольшой тестовый скрипт, который также печатает вывод R, например:

$ benchmark.sh 100 ./some_prog arg1 arg2
n=100 | min    | Q1     | med    | mean   | Q3     | max    | std
wall  | 0.0400 | 0.0400 | 0.0500 | 0.0471 | 0.0500 | 0.0800 | 0.00624
user  | 0.0400 | 0.0400 | 0.0400 | 0.0426 | 0.0400 | 0.0700 | 0.00562
sys   | 0      | 0      | 0      | 0      | 0      | 0      | 0.00000
rss   | 2608   | 2657   | 2704   | 2728   | 2764   | 2920   | 95.06524
maxschlepzig
источник
1

Вариант 1 - sqlite :

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

Преимущества: проще определить таблицу по сравнению с решением 2.

Недостатки: вам нужно (вам?) Заботиться о сохранении данных.

Вариант 2 - rrdtool :

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

Преимущества: вы можете легко создавать графики с rrdtool graph .... Отсутствие проблемы с сохранением данных (круговая база данных).

Недостатки: немного сложнее определить базу данных rrd по сравнению с простой таблицей / представлением SQL

Михал Шрайер
источник