Dienstag, 29. Januar 2008

Perl 5.10: Smart Matching Benchmark

Über den neuen, coolen Smart-Matching-Operator hatte
ich schon mal etwas geschrieben (Perl 5.10: Smart Matching).

Angeregt durch Michael Schwerns Artikel Smart match beats the hell out of grep() and first() habe ich den dort erwähnten Benchmark ebenfalls einmal ausgeführt. Es stimmt: ~~ kann rasend schnell sein.


Benchmarking Code


#! perl
use Benchmark;
use 5.010;

use List::Util qw(first);

my @array = map { chr(64+int(rand(26)))."$_" } 1..1000;

timethese(100_000, {
'first' => sub {
my $needle = chr(64+int(rand(26))).int(rand(1000)+1);
first { $_ eq $needle } @array;
},
'grep BLOCK' => sub {
my $needle = chr(64+int(rand(26))).int(rand(1000)+1);
grep { $_ eq $needle } @array;
},
'grep EXPR' => sub {
my $needle = chr(64+int(rand(26))).int(rand(1000)+1);
grep $_ eq $needle, @array;
},
'~~' => sub {
my $needle = chr(64+int(rand(26))).int(rand(1000)+1);
$needle ~~ @array;
}
});


Meine Ergebnisse:

Benchmark: timing 100000 iterations of first, grep BLOCK, grep EXPR, ~~...
first: 36 wallclock secs (35.67 usr + 0.00 sys = 35.67 CPU) @ 2803.32/s (n=100000)
grep BLOCK: 21 wallclock secs (21.88 usr + 0.00 sys = 21.88 CPU) @ 4571.43/s (n=100000)
grep EXPR: 22 wallclock secs (21.52 usr + 0.02 sys = 21.53 CPU) @ 4644.47/s (n=100000)
~~: 11 wallclock secs (11.14 usr + 0.00 sys = 11.14 CPU) @ 8975.05/s (n=100000)


Cool und schnell, was will man mehr!


Vorhergehende Artikel von mir zu den neuen Features und Verbesserungen in Perl 5.10:

Keine Kommentare: