В языках программирования я обычно измерял бы производительность чего-то относительно быстрого (& lt; 1-секундное завершение), зацикливая его несколько тысяч раз, а затем получая среднее время на выполнение.
Как бы я сделать то же самое в bash, чтобы сравнить производительность выполнения двух очень быстрых команд?
В общем, простой способ - сделать time ./myscript.sh, но это покажет вам нуль секунду, так как ваш скрипт действительно быстр.
Вместо этого используйте простой способ , которые используют GNU date (возможность отображения наносекунд) и PS4.
Лучше использовать что-то вроде команды time.
У Bash также есть встроенный 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: заставляет bash использовать /usr/bin/time вместо time встроенный. Вы можете использовать time с циклом, чтобы получить «avrage», «min», «max» определенного ресурса say memory:
Этот код будет работать ./COMMAND 1000 раз, затем распечатывает «min, max, avg» из его общего объема (данных + стек + текст).
#/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 на:
command: заставляет bash использовать /usr/bin/time вместо встроенного time. %I: Количество входных файлов %P: процент CPU, который получил это задание %k: количество сигналов, переданных в процесс %U: использование ЦП в пользовательском режиме %S: использование ЦП в режиме ядрасм. man time
Благодаря muru для написания более четкого заявления awk.
Nevermind, получил:
N=10000
time(for i in $(eval echo "{1..$N}"); do
./mycommand &>/dev/null
done)
В общем, простой способ - сделать time ./myscript.sh, но это покажет вам нуль секунду, так как ваш скрипт действительно быстр.
Вместо этого используйте простой способ , которые используют GNU date (возможность отображения наносекунд) и PS4.
Лучше использовать что-то вроде команды time.
У Bash также есть встроенный 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: заставляет bash использовать /usr/bin/time вместо time встроенный. Вы можете использовать time с циклом, чтобы получить «avrage», «min», «max» определенного ресурса say memory:
Этот код будет работать ./COMMAND 1000 раз, затем распечатывает «min, max, avg» из его общего объема (данных + стек + текст).
#/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 на:
command: заставляет bash использовать /usr/bin/time вместо встроенного time. %I: Количество входных файлов %P: процент CPU, который получил это задание %k: количество сигналов, переданных в процесс %U: использование ЦП в пользовательском режиме %S: использование ЦП в режиме ядрасм. man time
Благодаря muru для написания более четкого заявления awk.
Nevermind, получил:
N=10000
time(for i in $(eval echo "{1..$N}"); do
./mycommand &>/dev/null
done)