Получить время выполнения программы в оболочке

Я хочу выполнить что-то в оболочке linux при нескольких различных условиях и иметь возможность выводить время выполнения каждого выполнения.

Я знаю, что мог бы написать скрипт на Perl или Python, который бы делал это, но есть ли способ сделать это в оболочке? (что случилось с Bash)

386
задан 05.10.2019, 09:27

10 ответов

Используйте встроенное ключевое слово time:

$ help time

time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The `-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

Пример:

$ time sleep 2
real    0m2.009s
user    0m0.000s
sys     0m0.004s
508
ответ дан 05.10.2019, 09:33
  • 1
    это - плохой ' time' версия, колотите встроенный. где внешний ' time' команда? – Znik 05.10.2019, 09:34
  • 2
    Как это используется на команде как time -p i=x; while read line; do x=x; done < /path/to/file.txt? Это immediatly возвращается 0.00 если я don' t помещают что-либо перед циклом с условием продолжения.. что дает? – natli 05.10.2019, 09:35

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

export PS1='[\t \u@\h]\ 

Приведенная выше команда приведет к изменению приглашения оболочки на:

[HH:MM:SS username@hostname]$ 

Каждый раз, когда вы запускаете команду ( или нажмите Enter), возвращаясь к приглашению оболочки, в приглашении будет отображаться текущее время.

отмечает:
1) имейте в виду, что если вы подождали некоторое время, прежде чем набрать следующую команду, то это время необходимо учитывать, то есть время в приглашении оболочки отображается метка времени, когда отображалось приглашение оболочки, а не при вводе команды. некоторые пользователи предпочитают нажимать клавишу Enter, чтобы получить новое приглашение с новой отметкой времени, прежде чем они будут готовы к следующей команде.
2) Существуют и другие доступные опции и модификаторы, которые можно использовать для изменения приглашения bash, см. (Man bash) для получения более подробной информации.

Приведенная выше команда приведет к изменению приглашения оболочки на:

[HH:MM:SS username@hostname]$ 

Каждый раз, когда вы запускаете команду ( или нажмите Enter), возвращаясь к приглашению оболочки, в приглашении будет отображаться текущее время.

отмечает:
1) имейте в виду, что если вы подождали некоторое время, прежде чем набрать следующую команду, то это время необходимо учитывать, то есть время в приглашении оболочки отображается метка времени, когда отображалось приглашение оболочки, а не при вводе команды. некоторые пользователи предпочитают нажимать клавишу Enter, чтобы получить новое приглашение с новой отметкой времени, прежде чем они будут готовы к следующей команде.
2) Существуют и другие доступные опции и модификаторы, которые можно использовать для изменения приглашения bash, см. (Man bash) для получения более подробной информации.

0
ответ дан 05.10.2019, 09:27

Выход

$ > g++ -lpthread perform.c -o per
$ > time ./per

вывод >>

real    0m0.014s
user    0m0.010s
sys     0m0.002s
2
ответ дан 05.10.2019, 09:28
  • 1
    Никакая потребность использовать -lphtread или -o теги. Просто должен использовать эти time команда, которую принятый ответ объясняет лучше. – Dennis 05.10.2019, 09:29
  • 2
    Это был пример.That, мой perform.c, имеет поточную обработку, таким образом, мне нужен-lpthread, и для простых идентификационных данных это-o на. – Robel Sharma 05.10.2019, 09:29

Вы можете использовать time и подоболочку ():

time (
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
)

Или в одной оболочке {}:

time {
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
}
9
ответ дан 05.10.2019, 09:28

Если вам нужна только точность с точностью до секунды, вы можете использовать встроенную переменную $SECONDS, которая подсчитывает количество секунд, в течение которых была запущена оболочка.

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done
12
ответ дан 05.10.2019, 09:29

Если вы собираетесь использовать время позже для вычисления, узнайте, как использовать опцию -f в /usr/bin/time для вывода кода , который экономит время. Вот некоторый код, который я недавно использовал, чтобы получить и отсортировать время выполнения целого класса студенческих программ:

fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...

Позже я соединил все файлы $timefile и перенаправил вывод в Lua интерпретатор . Вы можете сделать то же самое с Python или Bash или любой другой ваш любимый синтаксис. Я люблю эту технику.

15
ответ дан 05.10.2019, 09:30

Если вы хотите большей точности, используйте %N с date (и используйте bc для diff, потому что $(()) обрабатывает только целые числа).

Вот как это сделать:

start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time: %.6f seconds" $dur

Пример:

start=$(date +%s.%N); \
  sleep 0.1s; \
  dur=$(echo "$(date +%s.%N) - $start" | bc); \
  printf "Execution time: %.6f seconds\n" $dur

Результат:

Execution time: 0.104623 seconds
18
ответ дан 05.10.2019, 09:30

Для построчного измерения дельты попробуйте gnomon .

Утилита командной строки, немного похожая на ts moreutils, для добавления информации о временной метке к стандартному выводу другой команды. Полезно для длительных процессов, где вы хотите получить исторический отчет о том, что так долго.

Вы также можете использовать опции --high и / или --medium, чтобы указать порог длины в секундах, в течение которого гномон будет выделять метку времени красным или желтым цветом. И вы можете сделать еще несколько вещей.

example

42
ответ дан 05.10.2019, 09:31
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
78
ответ дан 05.10.2019, 09:31

Вы можете получить гораздо более подробную информацию, чем встроенная в bash time (которую упоминает Роберт Гэмбл), используя time (1) . Обычно это /usr/bin/time.

Примечание редактора: чтобы убедиться, что вы вызываете внешнюю утилиту time, а не ключевое слово time вашей оболочки , используйте ее как /usr/bin/time.
time - это POSIX-мандатная утилита , но единственная опция, которую требуется поддерживать, это -p.
Определенные платформы реализуют определенные нестандартные расширения: -v работает с утилитой GNU time, как показано ниже (вопрос помечен ); реализация BSD / macOS использует -l для получения аналогичных результатов - см. man 1 time.

Пример подробного вывода:


$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0

116
ответ дан 05.10.2019, 09:32
  • 1
    Вы wouldn' t, оказывается, знают, какой debian пакет, из которого прибыл бы? doesn' t, кажется, установлены по умолчанию – ʞɔıu 05.10.2019, 09:33
  • 2
    Я ссылался на Ваше сообщение Robert. Если Вы не имеете в виду команду, Вы предполагаете, что разве удар не встроен? – grepsedawk 05.10.2019, 09:33
  • 3
    Удивительно достаточно, it' s установленный от пакета, названного " time". – Paul Tomblin 05.10.2019, 09:33
  • 4
    Вывод от/usr/bin/time похож на " 0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident) k 0inputs+0outputs (0major+172minor) отсутствия страницы 0swaps" – Paul Tomblin 05.10.2019, 09:34
  • 5
    @Nick: " склонные sudo - получают установку time". – Robert Gamble 05.10.2019, 09:34

Теги

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