use Benchmark; [was: Re: [Cologne-pm] Regexps nehmen fuer file parsing?]

A. Pagaltzis pagaltzis at gmx.de
Thu Apr 3 10:46:47 CST 2003


* Michael Lamertz <mike at lamertz.net> [2003-04-03 18:28]:
> Falls die Reihenfolge der einzelnen Patterns immer
> dieselbe ist, koennte man die 2 Tests zu einem
> zusammenfassen, aber Benchmark hat gezeigt, dass das -
> unerwarteterweise - tatsaechlich ein Wenig langsamer ist.

Nicht unerwartet. Bei den zwei einzelnen Regexen hast du
zwei literale Strings die gegen den Input gesucht werden
müssen. Das kann die Regex-Engine erkennen und zu sehr
schnellen Suchen nach fixen Strings machen.

Beim Einzel-Regex hast du ein .* drin, sodass die Engine
viele Varianten möglicher Matches durchprobieren muss, nur
um zu backtracken.

Wenn du dir mal anschaust wie die Regex-Engine wirklich
funktioniert wirst du verstehen warum in vielen Fällen die
Ergebnisse kontraintuitiv scheinen.

> Die Methode von Aristoteles, die gesamte Zeile in ein Hash
> zu zerlegen finde ich in der Anwendung extrem elegant,
> aber leider ist die im Vergleich zu allen anderen Methoden
> grottenlangsam :(  Schade, denn die Tests werden dadurch
> schoen deutlich.

Das habe ich erwartet. Immerhin wird jedesmal der komplette
String zerlegt, dann nochmal jedes Einzelteil zerlegt, und die
Ergebnisliste in einen Hash gesteckt. Für jede einzelne
Zerlegung wird die Regex-Engine angeschmissen - also zigmal
pro Zeile, auch wenn die gesuchten Patterns sehr einfach
sind. Die Hash-Konstruktion ist auch nicht billig.

Aber dafür ist es mit diesem Ansatz bei weitem am
einfachsten, die Tests nachträglich zu ändern, flexibel nach
Userinput durchzuführen, die behaltenen Daten
weiterzuverarbeiten etc pp. Effizienz ist bei weitem nicht
der Weisheit letzter Schluss. Ich schreibe lieber klaren
Code der sich auch gut warten und erweitern lässt. Wenn ich
dann tatsächlich mehr Performance brauche, kann ich mit dem
Profiler drangehen und bestimmte Teile selektiv
verkomplizieren um den Code zu beschleunigen.

  More computing sins are committed in the name of
  efficiency (without necessarily achieving it) than for any
  other single reason - including blind stupidity.

  -- William A. Wulf, "A Case Against the GOTO"

Natürlich wäre es sinnlos, den Aufwand zu betreiben, wenn
man nur in einem 10-Zeilen-Skript eine Datei filtern will.
Ich tendiere aber generell eher zu "think big", daher meine
dementsprechenden Präferenzen. Generell sollte man aber IMO
lieber ein wenig zugunsten der Wartbarkeit irren als anders
rum. Wie meine Sig auf Perlmonks sagt - "Provisorien halten
am längsten". Man braucht daher unbedingt ein gesundes
Gleichgewicht zwischen den Extremen - selbst wenn was schon
gestern fertig werden muss sollte man nicht alle Vernunft
zum Fenster hinauswerfen. Das rächt sich dann gern nochmal..

</soapbox>

-- 
Gruss,
Aristoteles



More information about the Cologne-pm mailing list