Як середня кількість команд часу?


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

використання os.system(), викликає накладні витрати на виклик / створення оболонки з кожною командою. Можливо, краще використовувати subprocess.call ()
Антон

правда, але, швидше за все, буде постійним
bhdnx

4

Це не зовсім інструмент UNIX або GNU / Linux, але ви можете досить зручно використовувати програмне середовище R для статистичних обчислень для цього. (Я не можу знайти нічого більш конкретного для вашої задачі .)

Edit Як я міг сумніватися, там, звичайно , є еталоном для пакета R: rbenchmark. Це, мабуть, обгортання, system.time()які ви також можете просто використовувати безпосередньо. Або подивіться на це, просту пару функцій секундоміра. Також дивіться "Виконання системної команди" @ Код Rosetta (чи ні, це так system("command")).

Edit2 Я щойно бачив це запитання "Вимірювання часу в сценарії" у правій колонці "Пов'язані", це також можна використовувати, тобто витратити час, зробити для циклу ( Nрази), знову взяти час, обчислити проміжок часу, розділити на N. (Ще простіше, спробуйте time ( for-loop ), проаналізуйте його вихід, розділіть на N).


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

1

Варіант 1 - sqlite :

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

Переваги: ​​простіше визначити таблицю порівняно з рішенням 2.

Недоліки: вам потрібно (чи не так?) Дбати про збереження даних.

Варіант 2 - rrdtool :

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

Переваги: ​​ви можете легко генерувати графіки за допомогою rrdtool graph .... Немає проблем із збереженням даних (кругла база даних).

Недоліки: трохи складніше визначити базу даних rrd порівняно з простою таблицею / поданням SQL


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.