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?