Я хотел бы отобразить время завершения сценария.
То, что я сейчас делаю, -
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
Это просто показывает время начала и конца сценария. Можно ли отобразить мелкозернистый вывод, например время процессора / ввода-вывода и т. Д.?
Ответы:
Просто используйте
time
при вызове сценария:источник
real
,user
иsys
. О значениях этого см. Здесь .time $( ... ) >> out.txt
time (command1 && command2)
Если
time
не вариант,источник
date
дважды, например, чтобы вы могли в лучшем получить точность миллисекунды на практике, и , возможно , меньше), попробуйте использоватьdate +%s.%N
. (%N
это наносекунды со всей второй секунды.)date +%s%N
или используйте что-то более подходящее, например,bc
для вычисления фактического времени выполнения из двух значений, как предлагает jwchew. Тем не менее, я чувствую, что этот подход - неоптимальный способ сделать это;time
значительно лучше, если доступно, по причинам, изложенным выше.bc
и сделайте следующее:runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
Просто позвоните
times
без аргументов при выходе из сценария.С
ksh
илиzsh
вы также можете использоватьtime
вместо. Сzsh
,time
также даст вам время настенные часы в дополнение к времени процессора пользователя и системы .Чтобы сохранить статус выхода вашего скрипта, вы можете сделать это:
Или вы также можете добавить ловушку
EXIT
:Таким образом, время будет вызываться всякий раз, когда оболочка выходит и статус выхода будет сохранен.
Также обратите внимание , что все
bash
,ksh
иzsh
имеют$SECONDS
специальную переменную , которая автоматически инкрементируется каждый второй. В обоих случаяхzsh
иksh93
эта переменная также может быть сделано с плавающей точкой (сtypeset -F SECONDS
) , чтобы получить более высокую точность. Это только время настенных часов, а не время процессора.источник
time
подходу, представленному ранее. - Я думаю, чтоtimeit
подход, представленный в коде MATLAB, может быть полезен здесь.times
что не дает время на стену, верно? например,bash -c 'trap times EXIT;sleep 2'
Я немного опоздал к победе, но хотел опубликовать свое решение (с точностью до секунды) на случай, если другие натолкнутся на эту тему через поиск. Выходные данные имеют формат дней, часов, минут и, наконец, секунд:
Надеюсь, кто-то найдет это полезным!
источник
date
не поддерживает точность до секунды и просто добавляет литерал «N
» к метке времени.dt2=$(echo "$dt%86400" | bc)
. Просто говорю ... Кстати, я предпочитаю форму,dt2=$(bc <<< "${dt}%86400")
но это полностью личное.Мой метод для
bash
:источник
Да, это вызывает Python, но если вы можете с этим смириться, то это довольно хорошее и лаконичное решение.
источник
python
команды в подоболочке и чтение ее выходных данных в большинстве современных систем займет несколько миллионов наносекунд. То же самое для бегаdate
.Этот вопрос довольно старый, но, пытаясь найти мой любимый способ сделать это, эта тема поднялась высоко ... и я удивлен, что никто не упомянул об этом:
'perf' - это инструмент анализа производительности, включенный в ядро в разделе 'tools / perf' и часто доступный для установки в виде отдельного пакета ('perf' в CentOS и 'linux-tools' в Debian / Ubuntu). В Linux Kernal perf Wiki гораздо больше информации об этом.
Запуск «perf stat» дает довольно много подробностей, включая среднее время выполнения в конце:
источник
perf
?perf stat
теперь жалуется на «Возможно, у вас нет разрешения на сбор статистики». если вы не запускаете некоторые командыsudo
, что делает его бесполезным во всех сценариях, когда вы не полностью владеете целевой машиной.Небольшая функция оболочки, которая может быть добавлена перед командами для измерения их времени:
Затем используйте его в своем скрипте или в командной строке следующим образом:
источник
s=$(date +%s000)
, не уверен, работает ли он.Вот вариант ответа Алекса. Меня волнуют только минуты и секунды, но я также хотел, чтобы он был отформатирован по-другому. Итак, я сделал это:
источник
источник
date
до и после сценария и выдают разницу между ними?Лично мне нравится оборачивать весь мой код скрипта в какую-то «основную» функцию, например:
Обратите внимание, насколько просто использовать
time
команду в этом сценарии. Очевидно, вы не измеряете точное время, включая время синтаксического анализа, но я нахожу его достаточно точным в большинстве ситуаций.источник
Используя только bash, можно также измерить и рассчитать продолжительность времени для части сценария оболочки (или истекшее время для всего сценария):
Теперь вы можете либо просто распечатать разницу:
если вам нужна только дополнительная длительность, сделайте:
Вы также можете сохранить продолжительность в переменной:
источник
источник
Функция синхронизации, основанная
SECONDS
только на гранулярности второго уровня, не использует никаких внешних команд:Например:
дает
источник