例えばオブジェクトを毎回生成するんじゃなくて一度作って使いまわす
例えば MyApp::Memcached みたいなのがあったとして、 get/set する度にいちいちnewするより一度newしたのをシングルトンとかで保持して使いまわした方がいいよねーと思って
- 一度だけnewしたのを使いまわす
- ||= でいわゆるシングルトンみたいな
- per requestでnewする
は、この順でパフォーマンスいいだろうと予測したのだけど
use strict; use warnings; use Benchmark qw/:all/; use Cache::Memcached::Fast; my $instance; my $memd = Cache::Memcached::Fast->new({ servers => [ { address => 'localhost:11211' } ], }); cmpthese( timethese(0, { per => sub { my $m = Cache::Memcached::Fast->new({ servers => [ { address => 'localhost:11211' } ], }); $m->set(hoge => "hoge"); $m->get("hoge"); }, instance => sub { $instance ||= Cache::Memcached::Fast->new({ servers => [ { address => 'localhost:11211' } ], }); $instance->set(hoge => "hoge"); $instance->get("hoge"); }, once => sub { $memd->set(hoge => "hoge"); $memd->get("hoge"); }, }) );
% perl memd_instance.pl Benchmark: running instance, once, per for at least 3 CPU seconds... instance: 7 wallclock secs ( 1.05 usr + 2.00 sys = 3.05 CPU) @ 27661.64/s (n=84368) once: 8 wallclock secs ( 0.97 usr + 2.05 sys = 3.02 CPU) @ 29857.62/s (n=90170) per: 6 wallclock secs ( 1.49 usr + 1.87 sys = 3.36 CPU) @ 3597.32/s (n=12087) Rate per instance once per 3597/s -- -87% -88% instance 27662/s 669% -- -7% once 29858/s 730% 8% -- Rate per instance once per 3611/s -- -87% -87% instance 27853/s 671% -- -3% once 28812/s 698% 3% -- Rate per once instance per 4058/s -- -83% -85% once 24230/s 497% -- -10% instance 27061/s 567% 12% -- Rate per once instance per 3541/s -- -88% -88% once 28412/s 702% -- -2% instance 28951/s 718% 2% --
結果は一部省略。
perが毎回最低なのはいいとして、たまにinstanceがonceを上回る。
値も割とばらけるし。
しばらく考えた後に考えるのをやめた。
まあ何にしろper requestでnewするのはやめようねと。