スポンサーリンク

プログラミング言語によりますが、変数の値のインクリメントやデクリメントをするときに、加算子(++)、減算子(--)を利用します。加算子、減算子は、前置加算、後置加算、前置減算、後置減算ができます。

前置と後置には、意味の違いがあります。値の評価前に値をインクリメントやデクリメントするか、値の評価後にインクリメントやデクリメントをするか、です。

前置にするか、後置にするかにより、意味が変わることから、パフォーマンスにも影響が出てきます。C言語などのコンパイラでコンパイルして利用するタイプの言語であれば、コンパイラにより最適化(オプティマイズ)により、プログラマがあまり意識する必要がないと思いますが、PHPの場合は、今のところ、もし最高のパフォーマンスを要求するならプログラマが意識する必要があります。

for文などのループでカウンタとしてインクリメントやデクリメントをするときのケースについて検証します。

$i++, ++$iと$i--, --$iについて比較します。
pearライブラリのBenchmark_Timerがなぜか、最初の測定だけやけに時間がかかるので、2回ずつテストしています。

<?php
include ('Benchmark/Timer.php');

function for_before_add ( $count) {
	for ($i = 0; $i < $count;  ++$i) {
	}
}
function for_after_add ( $count ) {
	for ($i = 0; $i < $count;  $i++) {
	}
}
function for_before_dec ( $count) {
	for ($i = $count; $i > 0;  --$i) {
	}
}
function for_after_dec ( $count ) {
	for ($i = $count; $i > 0;  $i--) {
	}
}


$count = 1000;

echo $count, PHP_EOL;

$oTimer =& new Benchmark_Timer();
$oTimer->start ();
for_after_add ($count);
$oTimer->setMarker( 'after inc 1' );
for_before_add ($count);
$oTimer->setMarker( 'before inc 1' );

for_after_add ($count);
$oTimer->setMarker( 'after inc 2' );
for_before_add ($count);
$oTimer->setMarker( 'before inc 2' );


for_after_dec ($count);
$oTimer->setMarker( 'after dec 1' );
for_before_dec ($count);
$oTimer->setMarker( 'before dec 1' );

for_after_dec ($count);
$oTimer->setMarker( 'after dec 2' );
for_before_dec ($count);
$oTimer->setMarker( 'before dec 2' );

$oTimer->stop ();
$oTimer->display ();
?>

1000回のループにおける比較です。
12.8%程度の微妙な差ではありますが、後置よりも前置のほうが速いです。

% php /tmp/increment.php
1000
----------------------------------------------------------
marker        time index            ex time         perct
----------------------------------------------------------
Start         1201946709.92816000   -                0.00%
----------------------------------------------------------
after inc 1   1201946709.92981500   0.001655        17.94%
----------------------------------------------------------
before inc 1  1201946709.93086500   0.001050        11.38%
----------------------------------------------------------
after inc 2   1201946709.93204300   0.001178        12.77%
----------------------------------------------------------
before inc 2  1201946709.93310300   0.001060        11.49%
----------------------------------------------------------
after dec 1   1201946709.93423100   0.001128        12.22%
----------------------------------------------------------
before dec 1  1201946709.93523100   0.001000        10.84%
----------------------------------------------------------
after dec 2   1201946709.93633900   0.001108        12.01%
----------------------------------------------------------
before dec 2  1201946709.93733200   0.000993        10.76%
----------------------------------------------------------
Stop          1201946709.93738700   0.000055         0.60%
----------------------------------------------------------
total         -                     0.009227       100.00%
----------------------------------------------------------

10回のループにおける比較です。
7.3%程度、速いようです。

10
----------------------------------------------------------
marker        time index            ex time         perct   
----------------------------------------------------------
Start         1201949113.75993500   -                0.00%
----------------------------------------------------------
after inc 1   1201949113.76044300   0.000508        46.95%
----------------------------------------------------------
before inc 1  1201949113.76051700   0.000074         6.84%
----------------------------------------------------------
after inc 2   1201949113.76062400   0.000107         9.89%
----------------------------------------------------------
before inc 2  1201949113.76069000   0.000066         6.10%
----------------------------------------------------------
after dec 1   1201949113.76076300   0.000073         6.75%
----------------------------------------------------------
before dec 1  1201949113.76083100   0.000068         6.28%
----------------------------------------------------------
after dec 2   1201949113.76089800   0.000067         6.19%
----------------------------------------------------------
before dec 2  1201949113.76096200   0.000064         5.91%
----------------------------------------------------------
Stop          1201949113.76101700   0.000055         5.08%
----------------------------------------------------------
total         -                     0.001082       100.00%
----------------------------------------------------------

前置の場合、変数の値をインクリメント・デクリメントしから評価します。後置の場合は、変数の値を一時的に保持して、あとからインクリメントやデクリメントをするため、その一時的に値を持つ処理がパフォーマンスの差を生みます。

まとめると

++$i は $i++ より速い。
--i は $i-- より速い。

ということです。

PHPの処理系が自動的に最適化してくれるようになるまでのTipsでした。
参照しているページ (サイト内): [2008-01-31-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー