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

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

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

#! /Bin /Баш
date ## эхо дату при запуске
# содержимое скрипта
дата ## эхо дату в конце

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

225 голосов | спросил mtk 19 +04002012-10-19T17:26:12+04:00312012bEurope/MoscowFri, 19 Oct 2012 17:26:12 +0400 2012, 17:26:12

12 ответов


302

Просто используйте time при вызове сценария:

time yourscript.sh
ответил Trudbert 19 +04002012-10-19T17:28:37+04:00312012bEurope/MoscowFri, 19 Oct 2012 17:28:37 +0400 2012, 17:28:37
105

Если time не является опцией,

start = `date +% s`
материал
end = `date +% s`

во время выполнения = $ ((конечный старт))
ответил Rob Bos 19 +04002012-10-19T21:38:17+04:00312012bEurope/MoscowFri, 19 Oct 2012 21:38:17 +0400 2012, 21:38:17
56

Просто вызовите 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), чтобы получить больше точности. Это только время настенных часов, а не время процессора.

ответил Stéphane Chazelas 19 +04002012-10-19T17:40:45+04:00312012bEurope/MoscowFri, 19 Oct 2012 17:40:45 +0400 2012, 17:40:45
22

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

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

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

ответил jwchew 30 AM00000060000005231 2013, 06:12:52
8

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

# Сбросить счетчик времени BASH
СЕКНДС = 0
    #
    # делать вещи
    #
ELAPSED = "Истекшее: $ (($ SECONDS /3600)) hrs $ ((($ SECONDS /60)% 60)) min $ (($ SECONDS% 60)) sec"
ответил Mark 26 Jam1000000amThu, 26 Jan 2017 00:28:41 +030017 2017, 00:28:41
4
#! /Bin /Баш
start = $ (дата +% s.% N)

# ЗДЕСЬ БЫТЬ КОДОМ

end = $ (date +% s.% N)
runtime = $ (python -c "print ($ {end} - $ {start})")

echo "Runtime было $ runtime"

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

ответил Alex 23 J0000006Europe/Moscow 2014, 17:52:14
3

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

start = $ (дата +% s)
end = $ (date +% s)
runtime = $ (python -c "print '% u:% 02u'% (($ {end} - $ {start}) /60, ($ {end} - $ {start})% 60)")
ответил mpontillo 17 J000000Thursday14 2014, 03:10:12
3
#! /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 ..."
ответил Shicheng Guo 15 Jam1000000amFri, 15 Jan 2016 07:00:58 +030016 2016, 07:00:58
2

Этот вопрос довольно старый, но, пытаясь найти мой любимый способ сделать это, эта нить поднялась высоко ... и я удивлен, что никто не упомянул об этом:

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%)
ответил Zaahid 24 SunEurope/Moscow2017-12-24T08:51:54+03:00Europe/Moscow12bEurope/MoscowSun, 24 Dec 2017 08:51:54 +0300 2017, 08:51:54
2

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

tm () {
  s = $ (дата +% s)
  $ @
  гс = $?
  echo "взял $ [$ (date +% s) - $ s] секунд. Код возврата $ rc"> & 2
  return $ rc
}

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

tm the_original_command со всеми его параметрами
ответил Evgeny 5 PMpWed, 05 Apr 2017 23:41:16 +030041Wednesday 2017, 23:41:16
1
#! /Bin /Баш
begin = $ (дата + "% s")

скрипт

termin = $ (date + "% s")
difftimelps = $ (($ око- $ начать))
echo "$ (($ difftimelps /60)) минут и $ (($ difftimelps% 60)) секунд, прошедших для выполнения сценария."
ответил Arun Binoy 22 62014vEurope/Moscow11bEurope/MoscowSat, 22 Nov 2014 10:40:41 +0300 2014, 10:40:41
1

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

начать = $ SECONDS

... # занимай много времени

конец = $ SECONDS

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

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

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

echo "duration: $ ((SECONDS-start)) истекшие секунды .."

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

let diff = end-start
ответил gauteh 7 J0000006Europe/Moscow 2017, 11:57:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132