Helmut Schellong / IPAddress Parser
StartSeite | HelmutSchellong/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Verschoben von LoopUnrolling:
Funktionen zum Testen des korrekten IP-Nummer-Formats
Gemäßigtes Loop-Unrolling, trotzdem noch wenig Kode - optimaler
Kompromiß, sehr schnell:
| 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:
| 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):
| 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
StartSeite | HelmutSchellong/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 9. September 2003 3:46 (diff))