2017-02-01 51 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的分辨率) –