2012-04-30 162 views
1

我有下面的代碼片段,我試圖評估時需要通過CPUCPU時間測量

但是我得到一些奇怪的結果

struct timeval begin, end; 
double cpu_time=0.0; 
gettimeofday(&begin, NULL); 
long cpu_sum = 0; 


for (i = 0; i < size; i++) { 
cpu_sum += array[i] * array[i]; 
}  
gettimeofday(&end, NULL); 
cpu_time = end.tv_sec - begin.tv_sec * 1000; 
cpu_time += (end.tv_usec - begin.tv_usec)/1000; 

printf("calculated sum: %d using CPU in %lf ms \n", cpu_sum, cpu_time); 

樣品結果= 1296217442.000000毫秒

我不要以爲這是以毫秒爲單位的正確時間值。 任何人都可以在這裏幫助什麼錯?

任何幫助,將不勝感激。

感謝

回答

1

如果你想要CPU時間,你可能想使用clock_gettime而不是CLOCK_PROCESS_CPUTIME_ID參數。

這可能是最方便(也是最準確)的方式,使用相同的函數來獲取實時和CPU時間,只需更改一個參數即可。

+1

雖然知道它不可移植 - 'getrusage()'是POSIX定義的函數。 – Alnitak

+2

@Alnitak,你爲什麼認爲這不是便攜式?它也是(可選的)POSIX的一部分。如果你真的想要可移植,C庫中的'clock'可能是更好的選擇。關於用戶時間,這應該給你與'getrusage'相同的信息。 –

+0

@JensGustedt它不在MacOS X上,也不在FreeBSD上。 – Alnitak

13

你需要修復您的運算符優先級:

cpu_time = (end.tv_sec - begin.tv_sec) * 1000; 
cpu_time += (end.tv_usec - begin.tv_usec)/1000; 

在你乘以1000 begin.tv_sec原稿,然後減去end.tv_sec;

而且,gettimeofday()不是測量「掛鐘時間」,而不是CPU時間,後者是衡量該過程花費多少「CPU工作量」的更好度量。如果另一個進程與您同時使用CPU,則結果將不準確。

對於「正確的」CPU時間,您應該使用(POSIX標準)getrusage()系統調用。

0

小除參宿一的回答是:

您定義cpu_timedouble,我想這是爲了應付可能的溢出(運行時間超過〜2M秒以上)。 但在線路:

cpu_time = (end.tv_sec - begin.tv_sec) * 1000; 

右手側被評價爲unsigned integer,以及約4M秒後會溢出。之後將它分配給double將無濟於事。
所以,如果你真的在乎長遠的時間,這樣做:

cpu_time = (double)(end.tv_sec - begin.tv_sec) * 1000; 
+0

實際上,只要將'1000'改成'1000.0'就能達到同樣的效果...... – Alnitak

+0

@Alnitak,的確如此,但我認爲演員陣容更加清晰。 – ugoren

1

奔騰級CPU已經讀取當前時間戳計數器變量,這是一個64位變量,到寄存器(EDX的指令:eax)。如果你想得到真正的CPU時間,你可以使用這個指令。你可以得到CPU的時鐘。 詳情請...此鏈接。