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

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

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

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

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

  • Как передать столько аргументов функции, сколько переменных, начинающихся с «string»?
  • Вставка некоторого текста с вкладками в документ здесь в окне PuTTY
  • Поиск каталога рекурсивно для файлов, перечисленных в csv, и скопировать их в другое место
  • Как получить pid последней выполненной команды в сценарии оболочки?
  • Как включить автозаполнение удаленных путей при использовании scp?
  • Невозможно остановить скрипт bash с помощью Ctrl + C
  • bash, который читает ввод пользователя и использует команду «cal» для проверки дат
  • Оболочки Bash с различными переменными среды
  • 11 Solutions collect form web for “Как эффективно выполнить время выполнения скрипта?”

    Просто используйте 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 
    Interesting Posts

    Vim, отложить отступ в глобальной конфигурации

    отрывные ключи

    xdotool sleep 1 vs sleep 1, любая разница?

    как подключиться к Mysql только один раз?

    Что это за ошибки игнорирования файла?

    Автоматическое создание make-файлов для другого компилятора из существующего make-файла

    Я хочу сконденсировать список диапазонов (от-до)

    Как сохранить курсор в верхней части экрана?

    Скрипт для создания другого скрипта обрабатывает все файлы в последовательности?

    Как ограничить все процессы пользовательского режима доступом к физической памяти только в определенном диапазоне?

    В какой ситуации tarball (.tgz) будет почти того же размера, что и оригинал

    Диск с альтернативным GPT

    Как работает система сборки пакетов портов?

    Gedit или другой редактор без командной строки с возможностью проверки орфографии на двух языках одновременно

    Задержка экрана GNU при перемещении курсора на начало / конец строк в Vim

    Linux и Unix - лучшая ОС в мире.