オブジェクト生成コスト

オブジェクトをいっぱいつくると重いよーみたいなこと聞いたことあるけど、実際のところどれくらいコスト違うんだろう、と気になったので調べてみた。


引数を2倍にして返すという単純な関数でベンチマーク

use Benchmark qw(:all);

sub new {
    bless +{} => $_[0];
}
sub method {
    return $_[1] * 2;
}
sub function {
    return $_[0] * 2;
}

my $o = __PACKAGE__->new;
cmpthese(1_000_000, {
    'init everytime' => sub { __PACKAGE__->new->method(10) },
    'init once'      => sub { $o->method(10) },
    'function'       => sub { function(10); },
});

                    Rate init everytime      init once       function
init everytime  500000/s             --           -62%           -73%
init once      1298701/s           160%             --           -31%
function       1886792/s           277%            45%             --

やはりただの関数が一番速く、毎回初期化するケースが最も遅い。その差がだいたい3-4倍ってところ。しかし、毎回初期化するケースでも秒間50万実行できてるので、perlOOP使うなというのは早合点。

まとめ

なるべく初期化回数をおさえ、かつ大量にオブジェクトつくらないようにすればOKでしょ!