Christian Kruse: "Trimmen" von Skalaren

Beitrag lesen

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?