Mittwoch, 28.2.2007, 09:52:54 Uhr
Was man mit RegEx tun sollte und was nicht
Reguläre Ausdrücke sind eine große, mächtige Fähigkeit in Perl, alle möglichen Dinge mit Zeichenketten anzustellen. Suchen, ersetzen und löschen von Teilen eines Skalars lassen sich damit ziemlich komplex und sehr variabel umsetzen.
Diese Komplexität und Flexibilität hat aber einen Nachteil: Für manche Aufgabenstellungen sind RegEx eigentlich zu langsam, bzw. es gibt wesentlich schnellere Varianten ohne RegEx .
Suchen nach festen Inhalten eines Skalars
$t="test";
if ($t=~ /te/){ ... }
sollte besser ersetzt werden durch:
$t="test";
if (index ($t,"te") != -1){ ... }
Die Variante mit index ist bis zu 50 % schneller. Funktioniert prima mit feststehenden Suchbegriffen.
Einzelne Zeichen ersetzen
Wenn man einzelne Zeichen ersetzen will, so sollte man nicht den s///-Operator anwenden, sondern tr benutzen.
Also nicht
$t=~ s/t/T/g;
sondern
$t=~ tr/t/T/;
tr ist schneller und spart Ressourcen.
\n am Zeilenende löschen
Man sollte besser nicht
anwenden, da es wesentlich langsamer ist und mehr Ressourcen verbraucht als ein
Zeichenfolge am Anfang eines Skalars suchen
Anstatt
$t = "Perltest";
if($t =~ /^Perl/) { }
sollte man besser
$t = "Perltest";
if(substr ($t,0,length ("Perl")) eq "Perl") { }
verwenden. Die Variante mit substr ist 25 % schneller.
Zeichenfolge am Ende eines Skalars suchen
Anstatt
$t = "Perltest";
$suchstring="test";
if($t =~ /$suchstring$/) { }
sollte man besser
$t = "Perltest";
$suchstring="test";
if(substr ($t,length ($t)-length ($suchstring),length ($suchstring)) eq $suchstring) { }
verwenden. Die Variante mit substr ist ca. 30 % schneller. Noch schneller gehts, falls die Abfrage in einer Schleife geschieht, mit
$t = "Perltest";
$suchstring="test";
$laesuchstring=length ($suchstring);
for ($i=0;$i<100;$i++){
if(substr ($t,length ($t)-$laesuchstring,$laesuchstring) eq $suchstring) { }
}
Hier wird das doppelte length ($suchstring) nur einmal außerhalb der Schleife errechnet anstatt zu jedem Aufruf. Der Geschwindigkeitsvorteil liegt bei ca. 5%.
Split mit RegEx
$t="Perl perlt";
($erstes,$zweites) = $ t=~ /(.+) (.+)/;
das ein Splitting durch das Leerzeichen darstellt, sollte besser geschrieben werden als
($erstes,$zweites)=split (" ",$t);
Die Split-Variante ist ca. 40 % schneller. Aber ich denke, normalerweise macht das eh niemand... aber passt so gut zu diesem Thema.
Kommentare zum Beitrag "Was man mit RegEx tun sollte und was nicht - Reguläre Ausdrücke
"
Kommentar von Renée Bäcker
$t = "Perltest";
if(substr($t,0,length("Perl")) eq "Perl") { }
schreibt man besser
$t = "Perltest";
if(index($t,"Perl") == 0) { }
Nicht nur kürzer, sondern auch schneller
Und statt
$t = "Perltest";
$suchstring="test";
if(substr($t,length($t)-length($suchstring),length($suchstring)) eq $suchstring) { }
besser
$t = "Perltest";
$suchstring="test";
if(substr($t,-length($suchstring)) eq $suchstring) { }
Thema: Perl RegEx Leistungsoptimiert
Der Beitrag "Was man mit RegEx tun sollte und was nicht - Reguläre Ausdrücke
" wurde 9978 mal gelesen.
Es wurde 1 x über diesen Beitrag abgestimmt.
Die durchschnittliche Beurteilung liegt bei
2 (1 = sehr gut - 6 = grottenschlecht).
Zufällige Beiträge im /blog/perl
0.0270330905914307 sec. to build ...Blogsoftware in pure Perl - Powered by a lot of Coffee...