2017-02-01 50 views
0

以下代碼在代碼塊gcc編譯器中運行。C程序的時間測量爲0

#include <sys/time.h> 
#include<stdio.h> 
int sumN(int n) { 
int i,sum; 
for(i=0; i<n; i++) { 
    sum += i; 
} 
return sum; 
} 

int main() { 
struct timeval stop, start; 
int i; 

for(i=0; i<10000;i+=100) 
    { 
     gettimeofday(&start, NULL); 
     sumN(i); 
     gettimeofday(&stop, NULL); 
     printf("%d : %lu\n",i, stop.tv_usec - start.tv_usec); 
    } 
return 0; 
} 

我得到以下輸出。 gettimeofday函數有問題嗎?或者輸出是正確的?我還需要根據函數的多個輸入大小和函數執行所花費的時間來繪製圖形。 enter image description here

+1

,所以該函數將返回隨機值:

使用返回的值,它不會被優化掉。在循環之前添加'sum = 0;'。 –

回答

1

函數sumN(i)的調用被優化了(我猜你沒有用-O0編譯),因爲返回的值根本沒有被使用。你可以看到它在結果集:

... 
call gettimeofday 
xorl %esi, %esi 
movq %rsp, %rdi 
call gettimeofday 
... 

,你可以看到有在gettimeofday之間沒有sum(N)調用。在`sumN`,`sum`是未初始化

... 
gettimeofday(&start, NULL); 
res=sumN(i); 
gettimeofday(&stop, NULL); 
printf("%d : %d, %lu\n",i, res, stop.tv_usec - start.tv_usec);//print the result, avoiding optimization! 
... 
+1

好的。此外,可能會出現翻轉:start = 1.999999和end = 2.000003,所以'tv_sec'應該被考慮進來。而且,在現代的x86 CPU上,'sumN'可以執行得如此之快,以至於'main'中'i'的低值可能會顯示爲零,因爲'sumN'在1us以下執行 - 'gettimeofday'的粒度(即'clock_gettime'可能是更好的選擇,因爲它[通常]具有1ns的分辨率) –