PHPパフォーマンスベンチマーク 後置加算・後置減算(++, --)より前置加算・前置減算(++, --)が高速
スポンサーリンク
プログラミング言語によりますが、変数の値のインクリメントやデクリメントをするときに、加算子(++)、減算子(--)を利用します。加算子、減算子は、前置加算、後置加算、前置減算、後置減算ができます。
前置と後置には、意味の違いがあります。値の評価前に値をインクリメントやデクリメントするか、値の評価後にインクリメントやデクリメントをするか、です。
前置にするか、後置にするかにより、意味が変わることから、パフォーマンスにも影響が出てきます。C言語などのコンパイラでコンパイルして利用するタイプの言語であれば、コンパイラにより最適化(オプティマイズ)により、プログラマがあまり意識する必要がないと思いますが、PHPの場合は、今のところ、もし最高のパフォーマンスを要求するならプログラマが意識する必要があります。
for文などのループでカウンタとしてインクリメントやデクリメントをするときのケースについて検証します。
$i++, ++$iと$i--, --$iについて比較します。
pearライブラリのBenchmark_Timerがなぜか、最初の測定だけやけに時間がかかるので、2回ずつテストしています。
1000回のループにおける比較です。
12.8%程度の微妙な差ではありますが、後置よりも前置のほうが速いです。
10回のループにおける比較です。
7.3%程度、速いようです。
前置の場合、変数の値をインクリメント・デクリメントしから評価します。後置の場合は、変数の値を一時的に保持して、あとからインクリメントやデクリメントをするため、その一時的に値を持つ処理がパフォーマンスの差を生みます。
まとめると
++$i は $i++ より速い。
--i は $i-- より速い。
ということです。
PHPの処理系が自動的に最適化してくれるようになるまでのTipsでした。
前置と後置には、意味の違いがあります。値の評価前に値をインクリメントやデクリメントするか、値の評価後にインクリメントやデクリメントをするか、です。
前置にするか、後置にするかにより、意味が変わることから、パフォーマンスにも影響が出てきます。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]
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
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