opi: Pointer ans Ende der Datei setzen mit seek

Beitrag lesen

Hallo,

oh je, ich nehme alles wieder zurück!

Ich habe ganz vergessen, dass nach dem substr ja auch noch die
Leerzeichen weggeschnitten werden müssen, die am Ende des Strings
vorkommen könnten.

Somit ist mein Beispiel hinfällig!

my $string = "string0    string1   string2   string3   string4   string5   string6   string7   string8   string9   ";

Benchmark::cmpthese(-1, {
           'substr'  =>  sub { my $f0 = substr($string, 0, 10);
                               my $f1 = substr($string, 11, 10);
                               my $f2 = substr($string, 21, 10);
                               my $f3 = substr($string, 31, 10);
                               my $f4 = substr($string, 41, 10);
                               my $f5 = substr($string, 51, 10);
                               my $f6 = substr($string, 61, 10);
                               my $f7 = substr($string, 71, 10);
                               my $f8 = substr($string, 81, 10);
                               my $f9 = substr($string, 91, 10);
                             },
           'split'   =>  sub { my ($f0, $f1, $f2, $f3, $f4, $f5, $f6, $f7, $f8, $f9) = split /\s+/, $string; },
           'regexp'  =>  sub { $string =~ /^(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+$/;
                               my $f0 = $1;
                               my $f1 = $2;
                               my $f2 = $3;
                               my $f3 = $4;
                               my $f4 = $5;
                               my $f5 = $6;
                               my $f6 = $7;
                               my $f7 = $8;
                               my $f8 = $9;
                               my $f9 = $10;
                         },
   });

Benchmark: running regexp, split, substr for at least 1 CPU seconds...
    regexp:  1 wallclock secs ( 1.00 usr +  0.06 sys =  1.06 CPU) @ 40572.64/s (n=43007)
     split:  1 wallclock secs ( 1.02 usr +  0.03 sys =  1.05 CPU) @ 51199.05/s (n=53759)
    substr:  1 wallclock secs ( 1.04 usr +  0.04 sys =  1.08 CPU) @ 99554.63/s (n=107519)
          Rate regexp  split substr
regexp 40573/s     --   -21%   -59%
split  51199/s    26%     --   -49%
substr 99555/s   145%    94%     --

Nun habe ich es mal das Wegschneiden der Whitespaces hinzugenommen:

my $string = "string0    string1   string2   string3   string4   string5   string6   string7   string8   string9   ";

Benchmark::cmpthese(-1, {
           'substr'  =>  sub { (my $f0 = substr($string,  0, 10)) =~ s/\s+$//;
                               (my $f1 = substr($string, 11, 10)) =~ s/\s+$//;
                               (my $f2 = substr($string, 21, 10)) =~ s/\s+$//;
                               (my $f3 = substr($string, 31, 10)) =~ s/\s+$//;
                               (my $f4 = substr($string, 41, 10)) =~ s/\s+$//;
                               (my $f5 = substr($string, 51, 10)) =~ s/\s+$//;
                               (my $f6 = substr($string, 61, 10)) =~ s/\s+$//;
                               (my $f7 = substr($string, 71, 10)) =~ s/\s+$//;
                               (my $f8 = substr($string, 81, 10)) =~ s/\s+$//;
                               (my $f9 = substr($string, 91, 10)) =~ s/\s+$//;
                             },
           'split'   =>  sub { my ($f0, $f1, $f2, $f3, $f4, $f5, $f6, $f7, $f8, $f9) = split /\s+/, $string; },
           'regexp'  =>  sub { $string =~ /^(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+$/;
                               my $f0 = $1;
                               my $f1 = $2;
                               my $f2 = $3;
                               my $f3 = $4;
                               my $f4 = $5;
                               my $f5 = $6;
                               my $f6 = $7;
                               my $f7 = $8;
                               my $f8 = $9;
                               my $f9 = $10;
                         },
   });

Benchmark: running regexp, split, substr for at least 1 CPU seconds...
    regexp:  2 wallclock secs ( 0.93 usr +  0.07 sys =  1.00 CPU) @ 40325.00/s (n=40325)
     split:  1 wallclock secs ( 0.97 usr +  0.06 sys =  1.03 CPU) @ 45983.50/s (n=47363)
    substr:  1 wallclock secs ( 1.07 usr +  0.02 sys =  1.09 CPU) @ 41533.03/s (n=45271)
          Rate regexp substr  split
regexp 40325/s     --    -3%   -12%
substr 41533/s     3%     --   -10%
split  45983/s    14%    11%     --

und siehe da... die substr Variante wird natürlich langsamer.

Kann ich da noch etwas Tunen? Eventuell einen Ersatz für das
Schneiden mittels s/\s+$// ???

Greez,
opi

--
Selfcode: ie:( fl:( br:^ va:) ls:] fo:) rl:( n4:? ss:| de:] ch:? mo:|