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,這個待研究。