Beschreibe hier die neue Seite. |
Verschoben von LoopUnrolling: Funktionen zum Testen des korrekten IP-Nummer-Formats Gemäßigtes Loop-Unrolling, trotzdem noch wenig Kode - optimaler Kompromiß, sehr schnell: [[Code] int CkIpFmt?(const uchar *s0) // "127.3.21.4" { register const uchar *s= s0; register unsigned v, c, n=4; while (1) { v= s[0]-'0'; if (v>9) break; c= s[1]-'0'; ++s; if (c<=9) { v*=10, v+=c; if (v<10) break; c= s[1]-'0'; ++s; if (c<=9) { ++s; v*=10, v+=c; if (v>255) break; } } if (--n) { if (s[0]=='.') { ++s; continue; } } else { if (s[0]== 0) return (s-s0); } break; } return (-1); } ] Gegenbeispiel - 2..3-fach langsamer als oben: [[Code] int CkIpFmt?(const uchar *s0) { const uchar *s; register int d; register unsigned v; register int c; int p; for (s=s0,v=p=d=0; (c= *s); ++s) { if (c>='1'&&c<='9' || c=='0'&&(d||s[1]=='.'||!s[1])) { v*=10u; v+=c-'0'; ++d; continue; } if (c=='.' && (d==2 || d==3&&v<=255 || d==1)) { ++p; v=d=0; continue; } goto ERET; } if (p==3 && (d==2 || d==3&&v<=255 || d==1)) return (s-s0); ERET: return (-1); } ] --HelmutSchellong P.S. Das war übrigens der nicht geschwindigkeits-, sondern lesbar- und wartbarkeitsoptimierte Ausgangpunkt (erste Anwort auf eine Frage nach einer solchen Funktion in news:de.comp.lang.c im Juli 2000): [[Code] int StrRetRunlenDigit?(char *s) { int runlen=0; while(isdigit(*s)) { s++; runlen++; } return runlen; } int StrChkIpFormat?(char *s) /* return -1 on error */ { int i; int runlen; int val; for(i=1; i<=4; i++) { runlen=StrRetRunlenDigit?(s); if(runlen==0) { return(-1); } if(s[0]=='0') { return(-1); } val=atoi(s); if(val<0 || val>255) { return(-1); } s+=runlen; if(i<4) { if(*s=='.') { s++; } else { return(-1); } } } return(0); } ] Damals unterschrieben mit der Bemerkung "for Helmut Schellong to optimize", was Helmut auch prompt erledigte. -- HelmutLeitner : Richtig, das war wohl bis jetzt der letzte Thread in der NG, der mir so richtig Spaß gemacht hatte - und solch einen Algo hatte ich bis dahin nicht in meinen Archiven.--hs KategorieAlgorithmus KategorieOptimierung KategorieProgrammierBeispiele KategorieSchellong |
Funktionen zum Testen des korrekten IP-Nummer-Formats
Gemäßigtes Loop-Unrolling, trotzdem noch wenig Kode - optimaler Kompromiß, sehr schnell:
|
Gegenbeispiel - 2..3-fach langsamer als oben:
|
P.S. Das war übrigens der nicht geschwindigkeits-, sondern lesbar- und wartbarkeitsoptimierte Ausgangpunkt (erste Anwort auf eine Frage nach einer solchen Funktion in news:de.comp.lang.c im Juli 2000):
|
Damals unterschrieben mit der Bemerkung "for Helmut Schellong to optimize", was Helmut auch prompt erledigte. -- HelmutLeitner