だるろぐ

だるいぶろぐです

例えばオブジェクトを毎回生成するんじゃなくて一度作って使いまわす

例えば MyApp::Memcached みたいなのがあったとして、 get/set する度にいちいちnewするより一度newしたのをシングルトンとかで保持して使いまわした方がいいよねーと思って

  1. 一度だけnewしたのを使いまわす
  2. ||= でいわゆるシングルトンみたいな
  3. 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するのはやめようねと。