Я хочу выполнить что-то в оболочке linux при нескольких различных условиях и иметь возможность выводить время выполнения каждого выполнения.
Я знаю, что мог бы написать скрипт на Perl или Python, который бы делал это, но есть ли способ сделать это в оболочке? (что случилось с Bash)
Используйте встроенное ключевое слово 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
Одним из возможных простых методов (которые могут не соответствовать потребностям разных пользователей) является использование оболочки 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) для получения более подробной информации.
Выход
$ > g++ -lpthread perform.c -o per
$ > time ./per
вывод >>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
-lphtread
или -o
теги. Просто должен использовать эти time
команда, которую принятый ответ объясняет лучше.
– Dennis
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
}
Если вам нужна только точность с точностью до секунды, вы можете использовать встроенную переменную $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
Если вы собираетесь использовать время позже для вычисления, узнайте, как использовать опцию -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 или любой другой ваш любимый синтаксис. Я люблю эту технику.
Если вы хотите большей точности, используйте %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
Для построчного измерения дельты попробуйте gnomon .
Утилита командной строки, немного похожая на ts moreutils, для добавления информации о временной метке к стандартному выводу другой команды. Полезно для длительных процессов, где вы хотите получить исторический отчет о том, что так долго.
Вы также можете использовать опции --high
и / или --medium
, чтобы указать порог длины в секундах, в течение которого гномон будет выделять метку времени красным или желтым цветом. И вы можете сделать еще несколько вещей.
Вы можете получить гораздо более подробную информацию, чем встроенная в bash time
(которую упоминает Роберт Гэмбл), используя time (1) . Обычно это /usr/bin/time
.
Примечание редактора: чтобы убедиться, что вы вызываете внешнюю утилиту time
, а не ключевое слово time
вашей оболочки , используйте ее как /usr/bin/time
.
time
- это POSIX-мандатная утилита , но единственная опция, которую требуется поддерживать, это -p
.
Определенные платформы реализуют определенные нестандартные расширения: -v
работает с утилитой GNU time
, как показано ниже (вопрос помечен linux ); реализация BSD / macOS использует -l
для получения аналогичных результатов - см. man 1 time
. sup>
Пример подробного вывода:
$ /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
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