hier mal unter linux mit gcc 4.3.2:
der quellcode für die case version ist so:
die if-else variante kann man sich leicht denken.
zeiten für count=10000000:
case-version: 0.258690 sek
if-version: 0.320007 sek.
man beachte natürlich, dass ein großteil der laufzeit durch die random-funktion aber auch durch die simple addition verursacht wird. tatsache ist aber, dass die case-anweisung hier im schnitt um einenf aktor von 10 schneller als die if-anweisung ist. allerdings kommt der faktor nicht so deutlich hervor, da die randomfunktion einen immer vorhandenen löwnanteil an der schleife trägt.
edit: der faktor 10 ist nur im ideal-fall möglich, bei vielen vielen fallunterscheidungen. vorher wird er von immer benötigten anwweigungen erdrückt.
korrektur:
hab mal nen test gemacht ohne case bzw. if anweisungen, d.h. in der gleichen while schleife eifnach t+=x.
laufzeit ist: 0.118821
und nachdem ich auch die zeit abgezogen habe für das erstmalige zugreifen der konstanten ergibt scih folgendes:
zeit nur für die if-anweisungen:
ca 0.2 sek
zeit fpr die case-anweisungen:
ca 0.15 sek.
if also ca 1.33 mal langsamer. schraubt man das ganze hoch, d.h. mehr als 20 verzweigungen kommt man langsam näher dem faktor 10, der in der theorie erreichbar ist.
der quellcode für die case version ist so:
while(i++ < count) {
x = (20.0 * (xrandom() / (double)(MAX_XRANDOM+1.0)));
switch(x) {
case 0: t+=0;
break;
case 1: t+=1;
break;
case 2: t+=2;
break;
case 3: t+=3;
break;
case 4: t+=4;
break;
case 5: t+=5;
break;
case 6: t+=6;
break;
case 7: t+=7;
break;
case 8: t+=8;
break;
case 9: t+=9;
break;
case 10: t+=10;
break;
case 11: t+=11;
break;
case 12: t+=12;
break;
case 13: t+=13;
break;
case 14: t+=14;
break;
case 15: t+=15;
break;
case 16: t+=16;
break;
case 17: t+=17;
break;
case 18: t+=18;
break;
case 19: t+=19;
break;
default: t+=20;
break;
}
}
t2 = ttime();
fprintf(stderr,"case time %f\n", (t2-t1));
die if-else variante kann man sich leicht denken.
zeiten für count=10000000:
case-version: 0.258690 sek
if-version: 0.320007 sek.
man beachte natürlich, dass ein großteil der laufzeit durch die random-funktion aber auch durch die simple addition verursacht wird. tatsache ist aber, dass die case-anweisung hier im schnitt um einenf aktor von 10 schneller als die if-anweisung ist. allerdings kommt der faktor nicht so deutlich hervor, da die randomfunktion einen immer vorhandenen löwnanteil an der schleife trägt.
edit: der faktor 10 ist nur im ideal-fall möglich, bei vielen vielen fallunterscheidungen. vorher wird er von immer benötigten anwweigungen erdrückt.
Ergänzung ()
korrektur:
hab mal nen test gemacht ohne case bzw. if anweisungen, d.h. in der gleichen while schleife eifnach t+=x.
laufzeit ist: 0.118821
und nachdem ich auch die zeit abgezogen habe für das erstmalige zugreifen der konstanten ergibt scih folgendes:
zeit nur für die if-anweisungen:
ca 0.2 sek
zeit fpr die case-anweisungen:
ca 0.15 sek.
if also ca 1.33 mal langsamer. schraubt man das ganze hoch, d.h. mehr als 20 verzweigungen kommt man langsam näher dem faktor 10, der in der theorie erreichbar ist.
Zuletzt bearbeitet: