2017-02-01 4 views
0

次のコードは、codeblocks、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'が初期化されないので、関数はランダムな値を返します。ループの前に 'sum = 0;'を追加してください。 –

答えて

1

機能sumN(i)の呼び出しは、(私はあなたが-O0でコンパイルされていないと思います)を最適化されています。あなたは、結果のアセンブリでそれを見ることができます。

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

あなたがgettimeofdayの間でsum(N)のコールがない見ることができるように。

は、戻り値を使用し、それがアウトに最適化されません。sumN` `で

... 
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の解像度を持つので、より良い選択かもしれません) –

関連する問題