Hallo Andreas,
$text = ' Harry ist doof ';
$text =~ s/^\s*//;
$text =~ s/\s*$//;
Statt dem Asterix besser ein Plus. Ein * verlangsamt die Ausdrücke unnötig. Zum Vergleich:
ckruse@sunshine:~ $ cat test.pl
#!/usr/bin/perl -w
use strict;
use Benchmark qw(timethese);
my $data = (' ' x 10000).'Blub blahr blub'.(' ' x 10000);
timethese(1000000,{
oplus => sub {
$data =~ s/^\s+//o;
$data =~ s/\s+$//o;
},
plus => sub {
$data =~ s/^\s+//;
$data =~ s/\s+$//;
},
normal => sub {
$data =~ s/^\s*//;
$data =~ s/\s*$//;
}
}
);
ckruse@sunshine:~ $ perl test.pl
Benchmark: timing 1000000 iterations of normal, oplus, plus...
normal: 4 wallclock secs ( 3.63 usr + 0.01 sys = 3.64 CPU) @ 274725.27/s (n=1000000)
oplus: 2 wallclock secs ( 1.23 usr + 0.00 sys = 1.23 CPU) @ 813008.13/s (n=1000000)
plus: 0 wallclock secs ( 1.19 usr + 0.00 sys = 1.19 CPU) @ 840336.13/s (n=1000000)
ckruse@sunshine:~ $
Interessant dabei finde ich, dass das Beispiel gut zeigt, dass das o-Flag eine
zweischneidige Sache ist. Es kann Code schneller, aber auch langsamer machen. Die perldoc
sagt dazu, dass komplizierte Ausdrücke oft mit dem o-Flag schneller sind aber einfache
Ausdrücke dagegen oft mit ohne o-Flag. *Sehr* bezeichnend finde ich, wie extrem viel
langsamer der *-Ausdruck ist. Aber eigentlich logisch. Ich habe mal die Automaten zu den
Ausdrücken aufgezeichnet:
<img src="http://www.defunced.de/pics/automat1.png" border="0" alt="">
Daraus wird ersichtlich, dass der erste Ausdruck finit ist, während der zweite Ausdruck in
einem infiniten Automaten endet. Das bedeutet, dass die RegEx-Engine erst erkennen muss,
dass sie in einer Endlos-Schleife gelandet ist, bis der Audruck zwangs-terminiert wird.
Hm, interessantes Thema, vielleicht sollte ich mal einen FA darüber schreiben.
Grüße,
CK
Ihr wisst nicht, wie man den Menschen dient. Wie sollt ihr wissen, wie man den Goettern dienen soll?