前回 の追試。
List::Compareに食わす前に sort+uniq したものと、 IO::* でprintするときにjoin("\n", LIST) で一気に食わしたものとを追加しておうちマシン(Core2Duo 3GHz, 3GBメモリ)で再計測してみました。(後、後ろ切れるので普通のparagraphで..)
Benchmark: timing 10000 iterations of IO::Scalar(join)+Search::Dict, IO::Scalar+Search::Dict, IO::String(join)+Search::Dict, IO::String+Search::Dict, List::Compare, List::Compare(sorted), hash, hash+exists...
IO::Scalar(join)+Search::Dict: 32 wallclock secs (31.75 usr + 0.00 sys = 31.75 CPU) @ 314.96/s (n=10000)
IO::Scalar+Search::Dict: 39 wallclock secs (38.56 usr + 0.00 sys = 38.56 CPU) @ 259.32/s (n=10000)
IO::String(join)+Search::Dict: 32 wallclock secs (31.83 usr + 0.00 sys = 31.83 CPU) @ 314.19/s (n=10000)
IO::String+Search::Dict: 51 wallclock secs (50.67 usr + 0.00 sys = 50.67 CPU) @ 197.35/s (n=10000)
List::Compare: 83 wallclock secs (82.03 usr + 0.05 sys = 82.08 CPU) @ 121.84/s (n=10000)
List::Compare(sorted): 110 wallclock secs (109.73 usr + 0.14 sys = 109.87 CPU) @ 91.01/s (n=10000)
hash: 22 wallclock secs (21.30 usr + 0.05 sys = 21.34 CPU) @ 468.52/s (n=10000)
hash+exists: 21 wallclock secs (21.00 usr + 0.02 sys = 21.02 CPU) @ 475.83/s (n=10000)
IO::*にjoinしてから食わすのは、ずいぶんと早くなりますね。その代わりメモリ食うんでしょうけど。
逆に、事前にsort+uniqしたList::Compare版はえらく遅くなってしまってます。余計なことすんなってか..
計測コードはこちら。
use strict;
use warnings;
use Benchmark;
use List::Compare;
use IO::String;
use IO::Scalar;
use Search::Dict;
use List::MoreUtils qw/uniq/;
my @l1 = map { int rand 1000 } 1..1000;
my @l2 = map { int rand 1000 } 1..1000;
timethese(10000, {
q/List::Compare/ => sub {
List::Compare->new(\@l1,\@l2)->get_intersection;
},
q/List::Compare(sorted)/ => sub {
my @l1_ = uniq sort @l1;
my @l2_ = uniq sort @l2;
List::Compare->new(\@l1_,\@l2_)->get_intersection;
},
q/hash/ => sub {
my %in_l1 = map { $_ => 1 } @l1;
grep { $in_l1{$_} } @l2;
},
q/hash+exists/ => sub {
my %in_l1 = map { $_ => undef } @l1;
grep { exists $in_l1{$_} } @l2;
},
q/IO::String+Search::Dict/ => sub {
my $ios = IO::String->new;
$ios->print($_,"\n") for (uniq sort {$a cmp $b} @l1);
grep { -1 != look $ios, $_ } @l2;
},
q/IO::String(join)+Search::Dict/ => sub {
my $ios = IO::String->new;
$ios->print(join("\n", uniq sort {$a cmp $b} @l1));
grep { -1 != look $ios, $_ } @l2;
},
q/IO::Scalar+Search::Dict/ => sub {
my $ios = IO::Scalar->new(\my $data);
$ios->print($_,"\n") for (uniq sort {$a cmp $b} @l1);
grep { -1 != look $ios, $_ } @l2;
},
q/IO::Scalar(join)+Search::Dict/ => sub {
my $ios = IO::Scalar->new(\my $data);
$ios->print(join("\n", uniq sort {$a cmp $b} @l1));
grep { -1 != look $ios, $_ } @l2;
},
}
);




コメントする