Hallo Hiradur,
ich wollte deinen Benchmark auch mal Testen, verwende aber GNU/Linux. Weil der Quelltext von deinem Programm anscheinend nicht frei verfügbar ist hab ich schnell selbst eins in C geschrieben. Die Berechnung mache ich dabei einfach nach Definition der Fibonacci-Folge, also f_n = f_{n-1} * f_{n-2}. So weit so gut, das seltsame ist jetzt, dass die Berechnung z.B. von f_{90} nur ca. 4 Mikrosekunden (0,000004 s) dauert (auf einem Pentium M 1,6 GHz 32 Bit, kompiliert mit GCC 4.1.3), also um Größenordnungen weniger als bei dir. Eigentlich auch gar nicht so verwunderlich, sind ja nur einfache Multiplikationen und bei heutigen Taktraten geht das ja deutlich unter einer Sekunde.
Das Problem ist jetzt, dass meine Zeiten natürlich nicht mit deinen vergleichbar sind und sich eigentlich auch gar nicht für einen Benchmark eignen weil sie so klein sind. Kannst du mal einen Blick auf meinen Quelltext werfen und evtl. verraten was du im Wesentlichen anders machst.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main(int argc, char *argv[])
{
unsigned long long fnmm = 0; // (8 Byte) max. 18446744073709551615
unsigned long long fnm = 1; // f_93 = 12200160415121876738
unsigned long long fn = 4; // funktioniert aber nur bis f_92 ?!
unsigned int n=2;
unsigned int i=2;
struct timeval start, end;
long int diff=0;
i = atoi(argv[1]);
if(i>=93)
{
printf("Berechnung nur bis zur 93. Fibonacci-Zahl moeglich!\n");
return 0;
}
gettimeofday(&start, NULL);
for(n=2; n<=i; n++)
{
fn = fnm + fnmm;
fnmm = fnm;
fnm = fn;
}
gettimeofday(&end, NULL);
diff = (end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec);
printf("f_%i = %lli (%li Mikrosekunden)\n", n-1, fn, diff);
return 0;
}
Falls es Jemand ausprobieren will, einfach mit Compiler der Wahl (nach C99) kompilieren und dann mit der gewünschten Fibonacci-Zahl als Argument, z.B. "./fibonacci 45", aufrufen.
Gruß Sebastian