Bash

您如何計算命令執行的時間?

  • April 29, 2021

您如何知道一個正在執行的程序需要多長時間才能完成?

例子:

date; dd bs=1m if=/foo of=bar; date

^此範例只有 1 秒的解析度。

任何外殼都是可以接受的。

使用time

$ time longrunningcommand --takeyourtime

time將作為命令執行命令行的其餘部分(在此範例中longrunningcommand --takeyourtime),當命令完成時,它將列印經過的時間。

範例輸出(bash 內置time

$ time longrunningcommand --takeyourtime
...
output of longrunningcommand
...
real    0m5,020s
user    0m0,010s
sys 0m0,010s

有趣的資訊是real 0m5,020s。這意味著該命令大約需要 5 秒。有關其他數字的更多資訊,請參見此處:https ://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1


time是大多數 shell 中的內置命令。上面的範例輸出來自內置的 bash。有時您會想要使用“系統時間”。例如,為了避免暫時生成一個 shell。

如果您想使用該系統time,請這樣做:

$ /usr/bin/time longrunningcommand --getsomecoffee
$ \time longrunningcommand --callmom
$ command time longrunningcommand --mowthelawn

反斜杠在 bash 和其他一些 shell 中有效。command適用於大多數外殼。/usr/bin/time應該一直工作。

使用系統的範例輸出time

$ /usr/bin/time ./longrunningcommand --callmom
... output of longrunningcommand
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

有趣的資訊是0:06.02elapsed。這意味著該命令大約需要 6 秒。對於其他數字的含義,請閱讀以下手冊頁time: http: //man7.org/linux/man-pages/man1/time.1.html

你可以改變系統的輸出time。用於-p獲取類似於 shell 內置的輸出time

$ /usr/bin/time -p sleep 0.5
real 0.50
user 0.00
sys 0.00

用於-f編寫自己的格式。%E是“經過”的部分。那是您通常最感興趣的部分。

$ /usr/bin/time -f %E sleep 0.5
0:00.50

shell 內置命令和系統命令的區別不僅僅是輸出的格式。有關更多資訊,請閱讀此處的區別:內置命令與非內置命令有什麼區別?


如何重定向或擷取輸出

展示觀察命令hellostdoutstderr

#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2

範例呼叫:

$ ./hellostdoutstderr 
stdout
stderr

分別擷取 stdout 和 stderr

$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr

系統time列印到 stderr,因此它在 stderr 重定向中被擷取

$ /usr/bin/time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

您可以告訴系統time列印到單獨的文件

$ /usr/bin/time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
$ cat timeout 
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps

time即使 stdout 和 stderr 被重定向,bash 內置總是列印到終端。這是可能的,因為它是內置的並且可以做任何牠喜歡的事情(在 shell 中)

$ time ./hellostdoutstderr >stdout 2>stderr

real    0m0,511s
user    0m0,005s
sys 0m0,006s

(stdout 和 stderr 被擷取但time仍然可以列印到 shell)

仍然重定向這裡輸出閱讀:https ://stackoverflow.com/questions/18348593/how-can-i-output-from-usr-bin-time-to-a-file-at-the-right-location-內部執行

或在這裡:https ://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/


時間更複雜的命令你有幾個選項

如果您只想為兩個命令一個接一個地計時

$ time { command1 ; command2 ; }

也適用於管道

$ time { command1 | command2 ; }

對於更複雜的東西

$ time sh -c ' complex command chain '

但請注意引用和其他惡作劇。最好將命令放在腳本文件中:

$ time ./script.sh

引用自:https://unix.stackexchange.com/questions/86632