BlackCurtain::DBI::Cache::Memcachedって早いの? (2) 
Thursday, January 13, 2011, 12:10 PM - Programing, Programing / Perl
Posted by Administrator
実のところBlackCurtain::DBI::Cache::Memcachedが遅い、加えてその検証結果も予定調和だったりして

検証用コードは前回検証の付録と同一(timetheseの直前でCool'n'Quiteの影響を緩和するため糞ループを追加している)
sub BlackCurtainDBI
{
$sth2->bind_param(1,$ARGV[1],DBI::SQL_INTEGER);
$sth2->execute();
while($sth2->fetch()){
}
$sth2->finish();

return();
}

結果
> === 1 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 14 wallclock secs ( 7.73 usr + 2.12 sys = 9.85 CPU) @ 10152.28/s (n=100000)
> === 10 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 19 wallclock secs (13.48 usr + 1.76 sys = 15.24 CPU) @ 6561.68/s (n=100000)
> === 100 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 71 wallclock secs (62.88 usr + 3.10 sys = 65.98 CPU) @ 1515.61/s (n=100000)
この傾向は前回の検証でも十分観測できる

と、いうことはBlackCurtain::DBI::Cache::Memcached::stのsub FETCHが高い確率で悪
邪道だが動作そのものに問題ないので削除

そして結果
> === 1 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 9 wallclock secs ( 7.51 usr + 0.87 sys = 8.38 CPU) @ 11933.17/s (n=100000)
> === 10 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 16 wallclock secs (10.18 usr + 1.83 sys = 12.01 CPU) @ 8326.39/s (n=100000)
> === 100 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 58 wallclock secs (49.93 usr + 1.05 sys = 50.98 CPU) @ 1961.55/s (n=100000)
正直コード削れば早くなるのは実に当たり前の話だがな
ともかく今回に限らずsub FETCH{ ... }へ割り込むのは余り好ましくないっていうのははっきり見える結果

そしてこれを踏襲し
・ FETCH/STOREは最小限にしろ
・ サブクラスから->SUPERするな
・ コードを書くな
の3点を重点に置いて考えるならば

->execute(...)で勝手に全部キャッシュに突っ込んで->fetch(...)で->SUPER::fetch(...)しない
こんな感じのコードが好ましい
sub execute
{
my($f,@r) = @_;

my $memcached = \$f->{Database}->{Memcached_};
my $cache = \$f->{Memcached_cache};
(my $q = $f->{Statement}) =~s/\?/$f->{ParamValues}->{my $i++}/go;
if(!($$cache = $$memcached->get($q))){
$f->SUPER::execute();
push(@{$$cache},$row) while(my $row = $f->SUPER::fetch());
$$memcached->set($q,\@$$cache);

}
return($#{$$cache});
}

sub fetch
{
my($f,@r) = @_;

return(shift(@{$f->{Memcached_cache}}));
}

結果(5回試行して最高と最低を記載、どうしてか揺れる)
> === 1 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 7 wallclock secs ( 4.65 usr + 0.84 sys = 5.49 CPU) @ 18214.94/s (n=100000)
> === 1 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 11 wallclock secs ( 5.28 usr + 2.16 sys = 7.44 CPU) @ 13440.86/s (n=100000)
> === 10 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 7 wallclock secs ( 4.74 usr + 0.86 sys = 5.60 CPU) @ 17857.14/s (n=100000)
> === 10 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 12 wallclock secs ( 5.41 usr + 2.25 sys = 7.66 CPU) @ 13054.83/s (n=100000)
> === 100 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 8 wallclock secs ( 5.41 usr + 0.89 sys = 6.30 CPU) @ 15873.02/s (n=100000)
> === 100 records, 100000 repeats ===
> Benchmark: timing 100000 iterations of BCDBI(a)...
> BCDBI(a): 10 wallclock secs ( 5.54 usr + 1.67 sys = 7.21 CPU) @ 13869.63/s (n=100000)
1.0bと比べると理想的なカーブでパフォーマンスが向上している

pDBIが1, 10, 100 recordsで7739.94/s, 4095.00/s, 880.98/sである事を考えると13000/s以上の速度は上々といったところか
add comment ( 1695 views )   |  permalink

<<First <Back | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Next> Last>>