Все предложения действительно работают, но степень детализации измерения времени велика (обычно от 10 до 100 миллисекунд). Таким образом, он фактически измеряет что-то для вычисления, которое продолжается, например, полсекунды На современных процессорах (работающих от 2 до 3 ГГц, с 3-5 командами на такт) это означает что-то вроде миллиарда машинных инструкций («элементарный шаг» в нашей C-программе - с плохо определенным понятием шага десяток машинных инструкций). Таким образом, ваш тест слишком мал, вам действительно нужно вычислить фибионакцию в миллион раз (10).
Чтобы быть более точным, приведенная ниже программа (где выводятся некоторые вычисления, чтобы не оптимизировать их все) выполняется примерно за 2 секунды. (на миллион вычислений fibionacci, что меньше 16).
#include <stdio.h>
#include <unistd.h>
#include <time.h>
long fib(int n){
if(n == 0) return 0;
if(n == 1) return 1;
return fib(n-1)+fib(n-2);
}
int main ()
{
int i=0;
int p = (int) getpid();
clock_t cstart = clock();
clock_t cend = 0;
for (i=0; i<1000000; i++) {
long f = fib(i%16);
if (i % p == 0) printf("i=%d, f=%ld\n", i, f);
}
cend = clock();
printf ("%.3f cpu sec\n", ((double)cend - (double)cstart)* 1.0e-6);
return 0;
}
Последние несколько строк выводятся с time ./fib
(скомпилировано с gcc -O2 -Wall fib.c -o fib
)
есть
i=936079, f=610
i=948902, f=8
i=961725, f=233
i=974548, f=3
i=987371, f=89
2.140 cpu sec
./fib 2.15s user 0.00s system 99% cpu 2.152 total
бенчмаркинг бега менее чем за секунду не имеет особого смысла
(и вы можете использовать команду time
для измерения такого прогона)
См. Также время (7) и clock_gettime (2) .