2017-02-01 3 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

в 'sumN',' sum' является неинициализированным, поэтому функция возвращает случайные значения. Добавьте 'sum = 0;' перед циклом. –

ответ

1

Вызов функции sumN(i) оптимизирован из (я думаю, вы не компиляции с -O0), так как возвращаемое значение не используется. Вы можете увидеть это в результате сборки:

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

как вы можете видеть не вызов sum(N) между из gettimeofday.

Используйте возвращаемое значение, и это не будет оптимизированным:

... 
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,' sumN' может выполняться так быстро, что низкие значения 'i' в' main' могут отображаются как ноль, потому что 'sumN' выполняет в под 1us - зернистость' gettimeofday' (т.е. 'clock_gettime' может быть лучшим выбором, поскольку [обычно] имеет разрешение 1ns) –

 Смежные вопросы

  • Нет связанных вопросов^_^