インクリメントのベンチマーク

Perlは、プリインクリメントとポストインクリメントに性能差が殆ど無いと、
初めてのPerlか、Perlベストプラクティスかに書いてあった気がした。

実際どうなのか、前から気になっていたのでベンチマークを取ってみた。

ベンチマークスクリプト
use Benchmark qw( cmpthese );

my ( $num, $assign ) = ();

sub pre_increment {
    $num = shift;
    ++$num;
}

sub post_increment {
    $num = shift;
    $num++;
}

sub pre_inc_assign {
    $num = shift;
    $assign = ++$num;
}

sub post_inc_assign {
    $num = shift;
    $assign = $num++;
}

cmpthese( 10_000_000, {
        pre         =>  sub { pre_increment( 1 ) },
        post        =>  sub { post_increment( 1 ) },
        pre_assign  =>  sub { pre_inc_assign( 1 ) },
        post_assign =>  sub { post_inc_assign( 1 ) },
});
結果
                 Rate post_assign  pre_assign         pre        post
post_assign 2247191/s          --        -16%        -28%        -32%
pre_assign  2688172/s         20%          --        -14%        -19%
pre         3115265/s         39%         16%          --         -6%
post        3300330/s         47%         23%          6%          --


                 Rate post_assign  pre_assign         pre        post
post_assign 1865672/s          --        -23%        -23%        -30%
pre_assign  2427184/s         30%          --         -0%         -9%
pre         2433090/s         30%          0%          --         -9%
post        2673797/s         43%         10%         10%          --


                 Rate post_assign        post  pre_assign         pre
post_assign 2100840/s          --        -12%        -16%        -23%
post        2386635/s         14%          --         -5%        -12%
pre_assign  2500000/s         19%          5%          --         -8%
pre         2717391/s         29%         14%          9%          --


                 Rate        post post_assign  pre_assign         pre
post        2232143/s          --        -10%        -15%        -19%
post_assign 2481390/s         11%          --         -5%        -10%
pre_assign  2610966/s         17%          5%          --         -5%
pre         2754821/s         23%         11%          6%          --


                 Rate post_assign  pre_assign         pre        post
post_assign 2127660/s          --        -13%        -24%        -25%
pre_assign  2457002/s         15%          --        -13%        -13%
pre         2808989/s         32%         14%          --         -1%
post        2832861/s         33%         15%          1%          --
まとめ

ぶっちゃけ大差ない。
それでもやはり遅いのは変数代入を行うポストインクリメントかなという印象。


変数代入を行わない場合は、プリインクリメントでもポストインクリメントでも本当に変わらない。
きっとコンパイル時に、最適化されてるんだろう。