На языках программирования я обычно измерял бы уровень чего-то относительно быстро (<1 второе завершение) цикличным выполнением это несколько тысяч раз и затем получением среднего времени на завершение.
Как я сделал бы то же в ударе для сравнения выполнения выполнения двух очень быстрых команд?
Можно использовать модуль Python timeit
(который обычно используется для фрагментов кода Python), с subprocess.call
функция для выполнения внешних команд:
$ python3 -m timeit -s 'import subprocess' 'subprocess.call(["sleep", "0.1"])'
10 loops, best of 3: 103 msec per loop
можно изменить количество циклов с -n
:
$ python3 -m timeit -n 5 -s 'import subprocess' 'subprocess.call(["sleep", "0.1"])'
5 loops, best of 3: 103 msec per loop
И с тех пор sleep 0.1
должен спать для 100 мс, похоже, что измерение довольно точно.
Также см.:
Nevermind, получил его:
N=10000
time(for i in $(eval echo "{1..$N}"); do
./mycommand &>/dev/null
done)
В целом простой способ состоит в том, чтобы сделать time ./myscript.sh
, но это покажет, что Вы обнуляете второй, поскольку Ваш сценарий действительно быстр.
Вместо этого использование этот ответ , что GNU date
использования (способный показать наносекунды) и PS4
.
Лучше использовать что-то как time
команда.
Bash также имеет a time
встроенный, то, что я предлагаю, использует time
двоичный файл, расположенный в: /usr/bin/time
.
Для одного времени выполнения:
command time -f "\nElapsed: %E \nUser: %U \nSystem: %S \nMemory: %M\n" \
./MyCommand 1> /dev/null
Какие выводы:
Elapsed: 0:00.01
User: 0.00
System: 0.00
Memory: 2412
command
: силы колотят использованию /usr/bin/time
вместо time
встроенный.Можно использовать time
с циклом для получения "avrage" "минуты", "макс." определенного ресурса говорят память:
Этот код будет работать ./COMMAND
команды 1000 раз, затем распечатывает "минуту, макс., в среднем" ее общего количества (data+stack+text) использование памяти.
#/bin/bash
tmpfile=`mktemp`
for i in {1..1000}; do command time -ao $tmpfile -f "%K" ./COMMAND 1>/dev/null; done;
awk 'NR == 1 {min = $0} $0 > max {max = $0} {total += $0} END {print total/NR, min, max}' $tmpfile
rm $tmpfile
Вот:
2436.89 2524 2324
Можно измениться %K
с:
%E
: Прошедшее реальное время%I
: Количество исходных данных файла%P
: Процент ЦП, который получило это задание%k
: Количество сигналов поставляется процессу%U
: Использование ЦП в непривилегированном режиме%S
: Использование ЦП в привилегированном режимепосмотрите man time
Благодаря muru для записи более ясного awk
оператор.