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:|