title image


Smiley Das ist Unfug
> Angeblich soll diese Funktion unten, sehr schnell, und sicher sein?!



Ich würde eher sagen: der Autor dieser Zeilen programmiert entweder Mikrocontroller, oder hat nicht grad große Ahnung davon, was man in C machen sollte und was nicht.



Probe aufs Exempel: vergleichen wir dieses Machwerk mal mit ganz naivem Code, wo wir dieses loop unrolling und die register-Deklarationen rausgeschmissen haben:





#include <stdio.h>

#include <sys/time.h>

#include <time.h>

#include <stdlib.h>



static unsigned int str_len_v1(register char *s)

{

register char *t;



t = s;

for (;;) {

if (!*t) return t - s; ++t;

if (!*t) return t - s; ++t;

if (!*t) return t - s; ++t;

if (!*t) return t - s; ++t;

}

}



static unsigned int str_len_v2(char *s)

{

char *t;

t=s;



while(*t++){}



return t-s-1;

}



static char str[100001];



static double time_now(void)

{

struct timeval tv;

struct timezone tz;



if(0!=gettimeofday(&tv,&tz))

{

perror("gettimeofday()");

exit(1);

}



return tv.tv_sec+0.000001*tv.tv_usec;

}



int main(void)

{

int i,k;

double t0,t1,t2;



for(i=0;i<100000;i++)

{

str[i]='a'+i%16;

}

str[100000]=0;



t0=time_now();



for(i=0;i<10000;i++)

{

k=str_len_v1(str);

}

printf("v1 k=%d\n",k);



t1=time_now();



for(i=0;i<10000;i++)

{

k=str_len_v2(str);

}

printf("v2 k=%d\n",k);

t2=time_now();



printf("Time v1: %f\nTime v2: %f\n", t1-t0, t2-t1);

return 0;

}





Probe aufs Exempel:





$ gcc -march=pentium4 -O6 -o code code.c

$ ./code

v1 k=100000

v2 k=100000

Time v1: 0.813398

Time v2: 0.593371





Ergebnis: unser Autor, der versucht hatte, hier oberschlau zu sein, und von Hand Arbeit zu machen, die eigentlich der Compiler machen soll, war offenbar ziemlich auf dem Holzweg.



Bemerkung hierzu: Moderne C-Compiler wissen selber ganz gut, wie weit Loops unrolled werden sollen. Ausserdem unterstuetzen superskalare superpipelined Mikroprozessoren internes Loop-Unrolling via register renaming (Stichwort: Tomasulo Algorithmus).



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: