Halihallo Struppi
So, jetzt bin ich auch mal grad am Benchmarken gewesen.
use Benchmark;
my $text = 'test\n';
Hast du dir $text mal ausgeben lassen?
my $text = "test\n";
sonst gibt's keine abschliessende Newline und du misst zwar etwas,
aber bestimmt etwas falsches :-)
Benchmark::cmpthese(-1, {
'regExp$' => sub { $text =~ s/\n$//; },
'regExp' => sub { $text =~ s/\n//; },
'chomp' => sub { chomp $text; },
});
Das Problem ist, dass bei $text nur bei der ersten Iteration die
Newline weggehackt wird und alle anderen haben dann nur noch 'test'
zu behandeln. Wir messen also wiederum nicht das, was wir wollen.
Kleines Update zum Benchmark:
use Benchmark;
my $text2 = "befehl -cvzf test parameter\n";
## möglichst Realitätsnahe
my $text = $text2;
Benchmark::cmpthese(2000000, {
'regExp$' => sub { $text=$text2; $text =~ s/\n$//; },
'regExp' => sub { $text=$text2; $text =~ s/\n//; },
'chomp' => sub { $text=$text2; chomp $text; },
});
Nunja, das mit den $text=$text2 ist zwar auch nicht das, was wir
messen wollen, aber ohne messen wir einfach das falsche. Nun, deshalb
habe ich einfach fix 2000000 Iterationen veranschlagt, somit ist
$text=$text2 bei allen drei Tests nahezu Konstant und wir messen nur
die Unterschiede bei der Newline-wegtrennung. Zudem musste ich diesen
Benchmark einige Male nacheinander durchführen um sicher zu gehen,
dass die Ergebnisse immer in etwa dieselben bleiben (da $text=$text2
viel länger dauert als Newlinewegtrennung können die Ergebnisse durch
aus falsch sein, über mehrmaliges Iterieren kann man jedoch bei
fast immerwährend gleichen Ergebnissen eine These formulieren).
Ach ja, man hätte auch "local $text" sagen können. Aber dort haben wir
das Problem, dass local so dermassen langsam ist, dass wir bei allen
drei cmp's so ziemlich denselben Durchsatz haben...
Nunja, unter'm Strich kann ich sagen: Ich komme auf dieselben
Aussagen (und Folgen) wie du :-)
chomp ist am schnellsten, dann kommt regExp$ und dann chomp. Beim
genauen Hinsehen fällt sogar auf, dass chomp stets fast doppelt so
schnell ist wie die beiden RegExpe und die regExp$ nur wenig
schneller ist, als regExp. Wenn man jedoch standardmässig sehr viel
längere Shell-Befehle absetzen möchte (>2000 Zeichen), dann wird's
wohl eine starke Verbesserung von regExp$ bezüglich regExp geben (
müsste man alerdings auch wieder prüfen).
Rate regExp regExp$ chomp
regExp 8796679/s -- -35% -56%
regExp$ 13534063/s 54% -- -32%
chomp 19810824/s 125% 46% --
Ich habe in etwa folgendes:
Rate regExp regExp$ chomp
regExp 1422475/s -- -1% -56%
regExp$ 1437815/s 1% -- -55%
chomp 3205128/s 125% 123% --
Danke für deine Benchmark's Stuppi, hat mich grad motiviert selber
auszuprobieren.
Viele Grüsse
Philipp