インクリメントのベンチマーク
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% --
まとめ
ぶっちゃけ大差ない。
それでもやはり遅いのは変数代入を行うポストインクリメントかなという印象。
変数代入を行わない場合は、プリインクリメントでもポストインクリメントでも本当に変わらない。
きっとコンパイル時に、最適化されてるんだろう。