2009年04月24日

こんにちわ!金曜日担当・Shibuya内フェアリーことYappoです。

mixi Engineers’ Blog » PerlとRubyで省メモリなハッシュを使おうにて

100万件のレコードを格納した場合のメモリ使用量と処理時間を測ってみましょう。Perl(5.8.8)でテストコードを動かしたところ、以下の改善が確認できました。標準のハッシュに比べて、メモリ使用量がTCのオンメモリハッシュだと約61%、TCのオンメモリツリーだと約37%になることがわかります。処理時間に関しては157%ほどになっていますが、まあ許容範囲ですよね。
といった事が書かれており、その文面の上の解説で、tieしたので、tieしてるからおせーんじゃねーの?とテストコードも見ないで呟いてたらmikioさんからtie使わないでやってるよ!とつっこんでいただきました

でもまぁ腑に落ちない所もあり「mikio wareがperlのhashより遅いわけが無い!」と思いながらもshibuya.pmとかあって放置してたのですが、OpenFrepaカンファレンスも終わったのでTokyoCabinet.pmの実装を見てみたら、引数の値チェックをpure perlでやりつつXSのコードを呼んでいる実装でした。
引数の値チェックは置いといて、Perlと言うのは関数呼び出しのコストが馬鹿に出来ないので、試しにXSの関数を直接呼ぶように書き換えてベンチマークを取ってみました。

以下結果で、hashが元のテストコードで言う所のPerlのハッシュの実装で、tc_mikioがmikioさんのTCを使った実装で、tc_yappoが今回XSを直接呼ぶようにしてみた実装です。

$ perl ./benchmark.pl 
             Rate tc_mikio     hash tc_yappo
tc_mikio 333333/s       --     -29%     -52%
hash     469484/s      41%       --     -32%
tc_yappo 694444/s     108%      48%       --
=== ちゃんとkey/valueが入ってるか見るよ at ./benchmark.pl line 41.
hash : 00222791 => h00222791 at ./benchmark.pl line 43.
mikio: 00222791 => m00222791 at ./benchmark.pl line 44.
yappo: 00222791 => y00222791 at ./benchmark.pl line 45.
やっぱりTokyoCabinetの方が断然高速ですね!mikio++

以下ベンチマークスクリプトです

#!/usr/bin/perl
use strict;
use warnings;
use blib;
use Benchmark 'cmpthese';

use TokyoCabinet;

my $runnum = 1000000;
my $tc_args = sprintf('*#bnum=%d#mode=wct#xmsiz=0', $runnum);

my %hash;

my $mikio_db = TokyoCabinet::ADB->new;
$mikio_db->open($tc_args) || die 'mikio open failed';

my $yappo_db = TokyoCabinet::adb_new();
TokyoCabinet::adb_open($yappo_db, $tc_args) or die 'yappo open failed';

my($hash_i, $mikio_i, $yappo_i) = (0, 0, 0);
cmpthese(
    $runnum, {
        hash => sub {
            my $buf = sprintf('%08d', $hash_i);
            $hash{$buf} = 'h'.$buf;
            $hash_i++;
        },
        tc_mikio => sub {
            my $buf = sprintf('%08d', $mikio_i);
            $mikio_db->put($buf, 'm'.$buf);
            $mikio_i++;
        },
        tc_yappo => sub {
            my $buf = sprintf('%08d', $yappo_i);
            TokyoCabinet::adb_put($yappo_db, $buf, 'y'.$buf);
            $yappo_i++;
        }
    }
);

warn "=== ちゃんとkey/valueが入ってるか見るよ";
my $key = sprintf('%08d', int(rand($runnum)));
warn "hash : $key => " . $hash{$key};
warn "mikio: $key => " . $mikio_db->get($key);
warn "yappo: $key => " . TokyoCabinet::adb_get($yappo_db, $key);

$mikio_db->close;
TokyoCabinet::adb_close($yappo_db);

結論としてはTokyoCabinet.xsにid:gfxパワーが加わると(xsの中で引数チェックとかするの意)とんでもない速度になりそうです。

Posted by Yappo at 2009年04月24日 14:02 | TrackBack | Perl
Comments

rs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Money

Posted by: Runescpae power leveling at 2009年06月23日 15:46
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。