Как эффективно выполнить время выполнения скрипта?
Я хотел бы показать время завершения скрипта.
То, что я сейчас делаю, -
#! /Bin /Баш
date ## эхо дату при запуске
# содержимое скрипта
дата ## эхо дату в конце
Это просто показывает время начала и конца скрипта. Можно ли отображать мелкозернистый выход, такой как время процессора /время и т. Д.?
12 ответов
Просто используйте time
при вызове сценария:
time yourscript.sh
Если time
не является опцией,
start = `date +% s`
материал
end = `date +% s`
во время выполнения = $ ((конечный старт))
Просто вызовите times
без аргументов после выхода из вашего скрипта.
С помощью ksh
или zsh
вы также можете использовать time
. С помощью zsh
, time
вы также укажете время настенных часов в дополнение к времени процессора и system .
Чтобы сохранить статус выхода вашего скрипта, вы можете сделать это:
RET = $ ?; раз; выход "$ ret"
Или вы также можете добавить ловушку на EXIT
:
время ловушки EXIT
Таким образом, времена будут вызываться всякий раз, когда оболочка выйдет и статус выхода будет сохранен.
$ bash -c 'время ловушки EXIT; : {1..1000000} '
0m0.932s 0m0.028s
0m0,000s 0m0,000s
$ zsh -c 'время ловушки EXIT; : {1..1000000} '
оболочка 0.67s пользователь 0.01s система 100% cpu 0.677 всего
дети 0.00s пользователь 0.00s система 0% cpu 0.677 всего
Также обратите внимание, что все bash
, ksh
и zsh
имеют специальную переменную $ SECONDS
, которая учитывает количество секунд с момента запуска оболочки. В обоих zsh
и ksh93
эта переменная также может быть сделана с плавающей запятой (с помощью typeset -F SECONDS
), чтобы получить больше точности. Это только время настенных часов, а не время процессора.
Я немного опоздал к победителю, но хотел опубликовать свое решение (для точности второй секунды), если другие случайно наткнулись на эту нить через поиск. Выходной сигнал находится в формате дней, часов, минут и, наконец, секунд:
res1 = $ (дата +% s.% N)
# делайте что-нибудь здесь
res2 = $ (дата +% 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 "Общее время выполнения:% d:% 02d:% 02d:% 02.4f \ n" $ dd $ dh $ dm $ ds
Надеюсь, что кто-то там найдет это полезным!
Мой метод для bash
:
# Сбросить счетчик времени BASH
СЕКНДС = 0
#
# делать вещи
#
ELAPSED = "Истекшее: $ (($ SECONDS /3600)) hrs $ ((($ SECONDS /60)% 60)) min $ (($ SECONDS% 60)) sec"
#! /Bin /Баш
start = $ (дата +% s.% N)
# ЗДЕСЬ БЫТЬ КОДОМ
end = $ (date +% s.% N)
runtime = $ (python -c "print ($ {end} - $ {start})")
echo "Runtime было $ runtime"
Да, это вызывает Python, но если вы можете жить с этим, это довольно приятное, тощее решение.
Вот вариант ответа Алекса. Мне всего лишь минут и секунд, но я также хотел, чтобы он отформатировался по-другому. Поэтому я сделал это:
start = $ (дата +% 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 [email protected]
#PBS -m abe
#PBS -A k4zhang-group
START = $ (дата +% s)
для i в {1..1000000}
делать
эхо 1
сделанный
END = $ (дата +% s)
DIFF = $ (echo "$ END - $ START" | bc)
echo "Для выполнения этой задачи требуется DIFF = $ DIFF seconds ..."
Этот вопрос довольно старый, но, пытаясь найти мой любимый способ сделать это, эта нить поднялась высоко ... и я удивлен, что никто не упомянул об этом:
perf stat -r 10 -B sleep 1
'perf' - это инструмент анализа производительности, включенный в ядро под «tools /perf» и часто доступный для установки в виде отдельного пакета («perf» в CentOS и «linux-tools» на Debian /Ubuntu). Linux Kernal perf Wiki имеет гораздо больше информации об этом.
Запуск «perf stat» дает довольно много деталей, включая среднее время выполнения в конце:
1.002248382 секунд, прошедших (+ - 0,01%)
Небольшая функция оболочки, которая может быть добавлена перед командами для измерения их времени:
tm () {
s = $ (дата +% s)
$ @
гс = $?
echo "взял $ [$ (date +% s) - $ s] секунд. Код возврата $ rc"> & 2
return $ rc
}
Затем используйте его в своем скрипте или в командной строке следующим образом:
tm the_original_command со всеми его параметрами
#! /Bin /Баш
begin = $ (дата + "% s")
скрипт
termin = $ (date + "% s")
difftimelps = $ (($ око- $ начать))
echo "$ (($ difftimelps /60)) минут и $ (($ difftimelps% 60)) секунд, прошедших для выполнения сценария."
Используя только bash, также можно измерить и рассчитать продолжительность времени для части сценария оболочки (или прошедшего времени для всего скрипта):
начать = $ SECONDS
... # занимай много времени
конец = $ SECONDS
теперь вы можете либо просто распечатать разницу:
echo "duration: $ ((end-start)) seconds."
, если вам нужна только инкрементная продолжительность:
echo "duration: $ ((SECONDS-start)) истекшие секунды .."
Вы также можете сохранить продолжительность в переменной:
let diff = end-start