Helmut Schellong / IPAddress Parser
 
StartSeite | HelmutSchellong/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (keine anderen Diffs, Normalansicht)

Verändert: 1c1,118
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

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))
Suchbegriff: gesucht wird
im Titel
im Text