基礎命令學習目錄首頁html
原文連接:https://blog.csdn.net/adaptiver/article/details/6596143?utm_source=blogxgwz3linux
linux下time命令能夠獲取到一個程序的執行時間,包括程序的實際運行時間(real time),以及程序運行在用戶態的時間(user time)和內核態的時間(sys time)。shell
它的使用方法和前面講過的strace相似,在待執行的命令前加上time便可。bash
來看一個例子程序test.c函數
#include <stdio.h> int main() { FILE *fp = fopen("/tmp/testfile","w"); int i=0; for(i=0;i<3;++i) { fprintf(fp,"%d\n",i); } fclose(fp); return 0; }
編譯後用time命令來統計它的執行時間:post
[leconte@localhost test]$ time ./test real 0m0.020s user 0m0.000s sys 0m0.018s
結果代表,程序實際運行時間0.020s,用戶態運行時間接近0s,內核態運行時間0.018s。這是由於咱們主要操做是使用文件相關的系統調用,程序大部分時間工做在內核態。學習
須要注意的是,real並不等於user+sys的總和。real表明的是程序從開始到結束的所有時間,即便程序不佔CPU也統計時間。而user+sys是程序佔用CPU的總時間,所以real老是大於或者等於user+sys的。url
例如我在上述程序中加上sleep(1):spa
for(i=0;i<3;++i) { sleep(1); fprintf(fp,"%d\n",i); }
用time統計結果以下:操作系統
[leconte@localhost test]$ time ./test real 0m3.025s user 0m0.000s sys 0m0.019s
因爲執行了三次 sleep(1),real的時間比剛纔多了3s,這3s內程序並無佔用CPU,所以user+sys並無變化
【命令】time — 執行命令並計時
【格式】time [-p] command [arguments...]
【說明】
執行命令行"command [arguments...]",命令行執行結束時在標準輸出中打印執行該命令行的時間統計結果,其統計結果包含如下數據:
1)實際時間(real time): 從command命令行開始執行到運行終止的消逝時間;
2)用戶CPU時間(user CPU time): 命令執行完成花費的用戶CPU時間,即命令在用戶態中執行時間總和;
3)系統CPU時間(system CPU time): 命令執行完成花費的系統CPU時間,即命令在覈心態中執行時間總和。
其中,用戶CPU時間和系統CPU時間之和爲CPU時間,即命令佔用CPU執行的時間總和。實際時間要大於CPU時間,由於Linux是多任務操做系統,每每在執行一條命令時,系統還要處理其它任務。
另外一個須要注意的問題是即便每次執行相同命令,但所花費的時間也是不同,其花費時間是與系統運行相關的。
例1:
1. # time date
2. Sun Mar 26 22:45:34 GMT-8 2006
3.
4. real 0m0.136s
5. user 0m0.010s
6. sys 0m0.070s
7. #
在例1中,執行命令"time date"(見第1行)。系統先執行命令"date",第2行爲命令"date"的執行結果。第3-6行爲執行命令"date"的時間統計結果,其中第4行"real"爲實際時間,第5行"user"爲用戶CPU時間,第6行"sys"爲系統CPU時間。以上三種時間的顯示格式均爲MMmNN[.FFF]s。
在例1中,CPU時間 = 用戶CPU時間 + 系統CPU時間 = 0m0.010s + 0m0.070s = 0m0.080s,實際時間大於CPU時間,說明在date命令運行的同時,還有其它任務在運行。
【參數說明】
-p 以POSIX缺省的時間格式打印時間統計結果,單位爲秒。詳細的輸出格式見例2。
例2:
1. # time -p date
2. Wed Mar 27 00:33:11 GMT-8 2006
3. real 0.11
4. user 0.00
5. sys 0.02
6. #
在例2中,一樣執行命令"time date"(見第1行)。系統先執行命令 "date",第2行爲該命令的執行結果。第3-5行爲執行命令"date"的時間統計結果。注意本例的時間格式與例1中的時間格式差異,使用-p 參數後的時間顯示格式爲NN.FF,其單位爲秒。
【相關環境變量說明】
TIMEFORMAT 自定義輸出的時間格式。
咱們也能夠經過環境變量TIMEFORMAT來自定義輸出的時間格式[1]。格式中使用和標準C中的函數printf一致的轉義符,以及使用如下的轉義序列來指定輸出的時間格式:
%[prec][l][RUS]
其中,選項prec爲指定時間精度,即小數點後面的位數;選項l表示使用分秒(具體格式爲:MMmNN[.FFF]s)的格式;最後一個字符表示時間的類型,其中R表示實際時間,U表示用戶CPU時間,S表示系統CPU 時間,它們的單位均爲秒。
time命令缺省輸出的時間格式同 TIMEFORMAT=$'/nreal/t%3lR/nuser/t%3lU/nsys/t%3lS'。
使用-p參數的time命令輸出的時間格式同 TIMEFORMAT=$'real %2R/nuser %2U/nsys %2S'。
例3:
1. # export TIMEFORMAT=$'real %2R/nuser %2U/nsys %2S'
2. # time date
3. Wed Mar 27 00:52:03 GMT-8 2006
4. real 0.04
5. user 0.00
6. sys 0.01
7. #
比較例2和例3顯示結果,很容易發現例3雖然沒有使用參數-p,但其輸出的結果和例2如出一轍。
固然,咱們也能夠修改成任何本身喜歡的時間格式。
例4:
1. # export TIMEFORMAT=$'/nHello, ThinkerABC!/nreal time : %lR/nuser CUP time : %lU/nsystem CPU time : %lS'
2. # time date
3. Wed Mar 27 01:09:26 GMT-8 2006
4.
5. Hello, ThinkerABC!
6. real time : 0m0.016s
7. user CUP time : 0m0.006s
8. system CPU time : 0m0.008s
9. #
例4的第4-8行正是咱們自定義的輸出格式。
從以上介紹了三種指定時間格式的方法,即缺省的時間格式、使用參數-p的POSIX缺省的時間格式和設定環境變量TIMEFORMAT自定義的時間格式,Linux系統使用的前後順序以下:
1.參數-p的POSIX缺省時間格式;
2.環境變量TIMEFORMAT自定義的時間格式;
3.缺省的時間格式。
【退出狀態說明】
若是能執行command命令,則返回該命令的退出狀態,不然返回以下的退出狀態值:
127 命令未找到
126 命令找到,但不能執行
1-125 其它錯誤
譯至:http://unicus.jp/skmk/archives/338
因爲輸出 time 命令的結果到文件時使用的錯誤的方式,因此將其記錄下來。
環境是bash。
將運行的a.out程序的輸出和其所花的時間重定向到日誌文件中
time ./a.out > logfile time ./a.out | tee logfile
上面的例子是重定向結果到logfile,下面的例子是經過tee把標準輸出輸出到文件。
可是隻有time的輸出沒有被記錄到文件中。
這是由於time的結果是經過標準錯誤輸出的。
因此不把標準錯誤輸出重定向到文件中是不行的。
time ./a.out >& logfile time ./a.out > logfile 2>&1 time ./a.out 2>&1 | tee logfile
然而,這也是沒有用的。
./a.out >& logfile ./a.out > logfile 2>&1 ./a.out 2>&1 | tee logfile
由於這只是意味着把a.out的錯誤和標準輸出重定向到logfile。
(time ./a.out) >& logfile (time ./a.out) > logfile 2&>1 (time ./a.out) 2>&1 | tee logfile
用括號括起來。這樣就搞定了。換句話說,你是在一個子shell中運行。
另外最新的bash不只支持>&也支持&>。
也能夠用{;} 指定一組命令。
{ time ./a.out ; } >& logfile { time ./a.out ; } > logfile 2&1 { time ./a.out ; } 2>&1 | tee logfile
{ 後必定要加空格,若是沒有的話,會報錯 -bash: syntax error near unexpected token `}’ 。後面的冒號;也不要忘了。
順便說一下,bash內置的命令time和GNU的time命令是不同的。經過追加完整的路徑/usr/bin/time 能夠執行GNU命令。
可是和內置的bash不一樣的是,不加括號也能夠將全部的輸出重定向到文件。固然加括號也沒問題。
/usr/bin/time ./a.out >& logfile /usr/bin/time ./a.out > logfile 2>&1 /usr/bin/time ./a.out 2>&1 | tee logfile
並且有輸出到文件的選項-o。
/usr/bin/time -o logfile ./a.out
/usr/bin/time -a -o logfile ./a.out > logfile