摘自:
最近突然有必要測試c語言中各個函式的執行時間,於是就搜尋了一下,發現有4種方法可以達成測算程式執行時間的目的。
它們分別是使用clock, times, gettimeofday, getrusage來實現的。下面就來逐一介紹,並比較它們的優劣點。
系統測試環境:
virtualbox (ubuntu 9.10)
gcc version 4.4.1
libc6 2.10.1-0ubuntu16
core duo t2500 2gmhz
首先先貼出我測試用的程式吧。
程式做的處理很簡單,就是填寫乙個1024*1024的矩陣。
只要修改第11行的定義值,就可以使用不同的測量方法了。
#include #include #include #include #include #define test_by_clock (char)(0x00)
#define test_by_times (char)(0x01)
#define test_by_gettimeofday (char)(0x02)
#define test_by_getrusage (char)(0x03)
#define test_method (test_by_gettimeofday)
#define coordination_x (int)(1024)
#define coordination_y (int)(1024)
static int g_matrix[coordination_x][coordination_y];
double gettimeval()
else if (test_method == test_by_getrusage)
return sttimeval.tv_sec + (double)sttimeval.tv_usec*1e-6;
}int main()
else if (test_method == test_by_times)
else if (test_method == test_by_gettimeofday)
else if (test_method == test_by_getrusage)
for (i = 0; i < coordination_x; i++) }
if (test_method == test_by_clock)
else if (test_method == test_by_times)
else if (test_method == test_by_gettimeofday)
else if (test_method == test_by_getrusage)
return 0;
}
使用clock的方法:
clock是ansi c的標準庫函式,關於這個函式需要說明幾點。
首先,它返回的是cpu耗費在本程式上的時間。也就是說,途中sleep的話,由於cpu資源被釋放,那段時間將不被計算在內。
其次,得到的返回值其實就是耗費在本程式上的cpu時間片的數量,也就是clock tick的值。該值必須除以clocks_per_sec這個巨集值,才能最後得到ss.mmnn格式的執行時間。在posix相容系統中,clocks_per_sec的值為1,000,000的,也就是1mhz。
最後,使用這個函式能達到的精度大約為10ms。
使用times的方法:
times的用法基本和clock類似,同樣是取得cpu時間片的數量,所不同的是要除以的時間單位值為sysconf(_sc_clk_tck)。
使用gettimeofday的方法:
用gettimeofday直接提取硬體時鐘進行運算,得到的結果的精度相比前兩種方法提高了很多。
但是也正由於它提取硬體時鐘的原因,這個方法只能計算程式開始時間和結束時間的差值。而此時系統中如果在執行其他的後台程式,可能會影響到最終結果的值。如果後台繁忙,系統dispatch過多的話,並不能完全真實反映被測量函式的執行時間。
使用getrusage的方法:
getrusage得到的是程式對系統資源的占用資訊。只要指定了rusage_self,就可以得到程式本身執行所占用的系統時間。
可以說是精度最高的測量方法了。
自己試用了這四種方法,感覺需要高精度測試的話,getrusage和gettimeofday都可以選擇。需要長時間測試的話,clock也是不錯的,尤其是考慮到它的通用性。
C語言測試程式執行時間
clock t clock void 這個函式返回從 開啟這個程式程序 到 程式中呼叫clock 函式 時之間的cpu時鐘計時單元 clock tick 數,在msdn中稱之為掛鐘時間 wal clock 其中clock t是用來儲存時間的資料型別,在time.h檔案中,可以找到它的定義,顯然clo...
測試c 函式的執行時間
clock 函式返回從 開啟這個程式程序 到 程式中呼叫clock 函式 時之間的cpu時鐘計時單元 clock tick 數,在msdn中稱之為掛鐘時間 wal clock 常量clocks per sec,它用來表示一秒鐘會有多少個時鐘計時單元。比如 我想知道vector在2種情況下的執行效率 ...
C 函式執行時間
遞迴和迴圈執行時間比較 c 計算函式執行時間system.diagnostics.stopwatch或者system.datetime.now using system using system.collections.generic using system.diagnostics using s...