2009-04-11

ありがとうございます。

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設定時まで...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん