http://anond.hatelabo.jp/20090408100019
ベンチを取ってみると、ハッシュの方が速かったです。
UPSERT処理SQL生成処理の汎用化に使用中だったのですが、プロファイルすると結構時間をくっていたので、key設定時まで遡って再構築したいと思います。
#!/usr/bin/perl use strict; use warnings; use Benchmark; my $item = { date => undef, type => undef, value => undef, title => undef, views => undef }; my @key = ('date', 'type'); my %key; my @update; timethese(1000000, { use_grep => sub { @update = grep { my $a = 1; foreach my $b (@key) { $a = 0 if $_ eq $b; } $a; } keys %{$item}; }, use_hash => sub { %key = map { $_ => 1 } @key; @update = grep { not exists $key{$_} } keys %{$item}; }, } );
実行結果
Benchmark: timing 1000000 iterations of use_grep, use_hash... use_grep: 10 wallclock secs ( 9.84 usr + 0.00 sys = 9.84 CPU) @ 101595.04/s (n=1000000) use_hash: 5 wallclock secs ( 6.43 usr + 0.00 sys = 6.43 CPU) @ 155593.59/s (n=1000000)
@itemsから@keyにある要素を除いたリストを@updateとして欲しいのですが、 下記のコードよりも、より高速な記述があれば是非ご教授くださいませ。 my @update = grep { my $a = 1; foreach my $b (@key) { ...
http://anond.hatelabo.jp/20090408034449 リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。 元のコードはgrep内でリニアサーチをやっているわけですから、...
ありがとうございます。ベンチを取ってみると、ハッシュの方が速かったです。 UPSERT処理SQLの汎用化に使用中なのですが、プロファイルすると結構時間をくっていたので、key設定時まで...