my と state のパフォーマンス比較

最近の Linux ディストリビューションperl は 5.10 以上になってきた感じなので、最近は state など新しい機能を使うようになってきました。

そこでちょっと気になったので state のパフォーマンスを計測してみました。ベンチマークコードは以下。動作が全く同じ訳ではないですが。

use 5.010;
use strict;
use warnings;
use Benchmark ':all';

cmpthese(timethese(-1, {
    'my'    => \&_my,
    'state' => \&_state,
}));

{
    my $v = 1;
    sub _my { $v }
}

sub _state {
    state $v = 1;
}

結果は以下のように、ベンチマークを実行する毎に違う結果が出ました。実行環境は Ubuntu 10.04 の perl 5.10.1 です。

Benchmark: running my, state for at least 1 CPU seconds...
        my:  1 wallclock secs ( 1.08 usr +  0.00 sys =  1.08 CPU) @ 8972488.89/s (n=9690288)
     state:  4 wallclock secs ( 2.14 usr +  0.00 sys =  2.14 CPU) @ 10718488.79/s (n=22937566)
            Rate    my state
my     8972489/s    --  -16%
state 10718489/s   19%    --

Benchmark: running my, state for at least 1 CPU seconds...
        my: -2 wallclock secs ( 1.15 usr +  0.00 sys =  1.15 CPU) @ 9459979.13/s (n=10878976)
     state:  2 wallclock secs ( 1.02 usr +  0.00 sys =  1.02 CPU) @ 7710116.67/s (n=7864319)
           Rate state    my
state 7710117/s    --  -18%
my    9459979/s   23%    --

Benchmark: running my, state for at least 1 CPU seconds...
        my:  2 wallclock secs ( 1.22 usr +  0.00 sys =  1.22 CPU) @ 9024628.69/s (n=11010047)
     state:  2 wallclock secs ( 1.04 usr +  0.00 sys =  1.04 CPU) @ 9830399.04/s (n=10223615)
           Rate    my state
my    9024629/s    --   -8%
state 9830399/s    9%    --