Intereting Posts
Почему я не могу перечислить каталог с разрешениями на чтение? Как проверить, была ли ISO записана на мой USB-накопитель без ошибок? Как создать изображение initramfs с помощью ссылок busybox? Настроить vim's: сделать, чтобы переключаться или открывать вкладки при ошибке Передача содержимого блочного устройства по плохой сети почему Firefox создает $ HOME / .pulse-cookie, когда я не использую pulseaudio CentOS 7 не может очистить монтировку привязки с помощью rbind и rslave Тема не применяется правильно Возможно ли для bash / readline «очистить» предложения по завершению вывода терминала? Как сделать следующее форматирование с помощью сценария sed или awk или bash на linux Проверьте, какие устройства сетевого блока используются Замените Raspbian на Arch Linux Как узнать, кто обратился к файлу или файл имеет доступ к монитору в Linux Пароль SSH запрашивается, когда в Tmux Поиск всех файлов на основе частичного имени файла и отображения размера файла

Как эффективно выполнить время выполнения скрипта?

Я хотел бы показать время завершения скрипта.

То, что я сейчас делаю,

#!/bin/bash date ## echo the date at start # the script contents date ## echo the date at end 

Это просто показывает время начала и конца скрипта. Можно ли отображать мелкозернистый выход, такой как время процессора / время и т. Д.?

Просто используйте time когда вы вызываете скрипт:

 time yourscript.sh 

Если time не является вариантом,

 start=`date +%s` stuff end=`date +%s` runtime=$((end-start)) 

Просто вызывать times без аргументов при выходе из сценария.

С помощью ksh или zsh вы также можете использовать time . С помощью zsh time также даст вам время настенных часов в дополнение к времени процессора и пользователя .

Чтобы сохранить статус выхода вашего скрипта, вы можете сделать это:

 ret=$?; times; exit "$ret" 

Или вы также можете добавить ловушку на EXIT :

 trap times EXIT 

Таким образом, времена будут вызываться всякий раз, когда оболочка выходит и статус выхода будет сохранен.

 $ bash -c 'trap times EXIT; : {1..1000000}' 0m0.932s 0m0.028s 0m0.000s 0m0.000s $ zsh -c 'trap time EXIT; : {1..1000000}' shell 0.67s user 0.01s system 100% cpu 0.677 total children 0.00s user 0.00s system 0% cpu 0.677 total 

Также обратите внимание, что все bash , ksh и zsh имеют специальную переменную $SECONDS которая подсчитывает количество секунд с момента запуска оболочки. Как в zsh и в ksh93 эта переменная также может быть сделана с плавающей точкой (с typeset -F SECONDS ) для получения большей точности. Это только время настенных часов, а не время процессора.

Я немного опоздал к победителю, но хотел опубликовать свое решение (для точности в секунду), если другие случайно наткнулись на эту нить через поиск. Выходной сигнал находится в формате дней, часов, минут и, наконец, секунд:

 res1=$(date +%s.%N) # do stuff in here res2=$(date +%s.%N) dt=$(echo "$res2 - $res1" | bc) dd=$(echo "$dt/86400" | bc) dt2=$(echo "$dt-86400*$dd" | bc) dh=$(echo "$dt2/3600" | bc) dt3=$(echo "$dt2-3600*$dh" | bc) dm=$(echo "$dt3/60" | bc) ds=$(echo "$dt3-60*$dm" | bc) printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds 

Надеюсь, кто-то там найдет это полезным!

Мой метод для bash :

 # Reset BASH time counter SECONDS=0 # # do stuff # ELAPSED="Elapsed: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec" 
 #!/bin/bash start=$(date +%s.%N) # HERE BE CODE end=$(date +%s.%N) runtime=$(python -c "print(${end} - ${start})") echo "Runtime was $runtime" 

Да, это называет Python, но если вы можете жить с этим, то это довольно приятное, краткое решение.

Вот вариант ответа Алекса. Мне всего лишь минут и секунд, но я также хотел, чтобы он отформатировался по-другому. Поэтому я сделал это:

 start=$(date +%s) end=$(date +%s) runtime=$(python -c "print '%u:%02u' % ((${end} - ${start})/60, (${end} - ${start})%60)") 
 #!/bin/csh #PBS -q glean #PBS -l nodes=1:ppn=1 #PBS -l walltime=10:00:00 #PBS -o a.log #PBS -e a.err #PBS -V #PBS -M shihcheng.guo@gmail.com #PBS -m abe #PBS -A k4zhang-group START=$(date +%s) for i in {1..1000000} do echo 1 done END=$(date +%s) DIFF=$(echo "$END - $START" | bc) echo "It takes DIFF=$DIFF seconds to complete this task..." 
 #!/bin/bash begin=$(date +"%s") Script termin=$(date +"%s") difftimelps=$(($termin-$begin)) echo "$(($difftimelps / 60)) minutes and $(($difftimelps % 60)) seconds elapsed for Script Execution." 

Небольшая функция оболочки, которая может быть добавлена ​​перед командами для измерения их времени:

 tm() { s=$(date +%s) $@ rc=$? echo "took $[$(date +%s)-$s] seconds" >&2 return $rc } 

Затем используйте его в своем скрипте или в командной строке:

 tm the_original_command with all its parameters 

Используя только bash, можно также измерить и вычислить продолжительность времени для части сценария оболочки (или прошедшего времени для всего скрипта):

 start=$SECONDS ... # do time consuming stuff end=$SECONDS 

вы можете либо просто распечатать разницу:

 echo "duration: $((end-start)) seconds." 

если вам нужна только инкрементная продолжительность:

 echo "duration: $((SECONDS-start)) seconds elapsed.." 

Вы также можете сохранить продолжительность в переменной:

 let diff=end-start