C/C++ | gettimeofday和clock的計時應用及區別

 

C++程序中通常需要計時來評估性能及耗時。耗時可以幫助我們分配計算資源,找到優化重點。

 

實驗背景:

在多線程的C++程序中,使用clock計時和gettimeofday計時的數據不一致,那麼,哪個函數統計了正確的數據呢?它們分別統計的是什麼數據呢?

原答案:measure-time-in-linux-time-vs-clock-vs-getrusage-vs-clock-gettime-vs-gettimeof

 

前提知識:

wall time (wall-clock time):直譯爲牆上的時間,指掛在牆上的時鐘顯示的時間。wall time通常與時區相關,不同時區數值不同,所以不能直接用來做耗時統計,通常用兩個wall time的相差值來統計。

 

clock():

clock返回的是用戶時間和系統時間的總和。過去的版本中,clock是用來統計CPU的cycle數的;而更新的版本中,要求每秒包含的clock數(CLOCKS_PER_SEC)爲1,000,000,則clock統計出的精度爲1µs(微秒)。

 

gettimeofday():

gettimeofday返回的是精度爲µs的wall-clock time。POSIX.1-2008建議,應用應該使用clock_gettime() 接口而不是gettimeofday()。

 

結論:

在多線程情況下,clock統計的是用戶和系統時間的總和,會比實際的程序耗時多出額外的統計;

用gettimeofday獲取不同時間段的wall time,然後做差可以得出精確爲微秒的耗時,示例代碼如下:

struct timeval start, end;
gettimeofday(&start, NULL);
test();

gettimeofday(&end, NULL);
int64_t abs_timediff = (end.tv_sec - start.tv_sec) * 1000ULL * 1000ULL + end.tv_usec - start.tv_usec;
double sec_timediff = (double)abs_timediff / 1000000;
cout << "Time cost of test() is: " << sec_timediff << "s." << endl;

而官方標準推薦使用clock_gettime,這個待研究。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章