[PHP-users 5089] Re: $i++ と ++$i の速度の差について

Mashiki php-users@php.gr.jp
Wed, 30 Jan 2002 03:12:51 +0900


 Mashikiです。

山田さん重松さん、回答いただきありがとうございます。

ドキュメントとして公開されているわけではないが、
(常識で考えれば)あたりまえということですね。

 実際にどれくらい差があるのか気になりましたので、
私のPentiam133M、php4.0.6のマシンでテストしてみました。
前置後置では100000回まわすと0.1秒の差になりました。
まだ体感するには小さすぎる差かも知れません。また現在
サーバーとして一般に用いられているスペックではこの差は
もっと小さくなるでしょう。しかし、小さいとはいえ差がある
ことはハッキリ理解できました。また、過度に長い変数名を
使ったときもパフォーマンス?に影響を与えるようです。

以下テスト実行結果とそのソースです。

−−−−−− 実行結果
ループテスト

1 回目 
	1 $a++ ×100000 2.028 秒
	2 ++$b ×100000 1.894 秒
	3 ++$cnt ×100000 1.928 秒
	4 ++$counterForBigLoopWithLongName ×100000 2.693 秒

2 回目 
	1 $a++ ×100000 2.029 秒
	2 ++$b ×100000 1.896 秒
	3 ++$cnt ×100000 1.927 秒
	4 ++$counterForBigLoopWithLongName ×100000 2.696 秒

3 回目 
	1 $a++ ×100000 2.028 秒
	2 ++$b ×100000 1.895 秒
	3 ++$cnt ×100000 1.927 秒
	4 ++$counterForBigLoopWithLongName ×100000 2.693 秒

4 回目 
	1 $a++ ×100000 2.029 秒
	2 ++$b ×100000 1.943 秒
	3 ++$cnt ×100000 1.973 秒
	4 ++$counterForBigLoopWithLongName ×100000 2.707 秒

−−−−−− 以下ソース
<HTML><head>
</head><BODY><h2>ループテスト</h2>
<pre>
<?php
function GetDelta($mtFrom, $mtTo){ // ミリ秒単位の差分取得
  list($usecFrom,$secFrom,$usecTo,$secTo)=explode(" ","$mtFrom $mtTo");
  return sprintf('%.3f', (float)$usecTo-(float)$usecFrom
                        +(float)$secTo-(float)$secFrom);
}

ini_set('max_execution_time','300');
for ($j=1; $j<=4; ++$j) {
  echo "\n$j 回目 \n";

  // 1 ++後置
  $mtStart = microtime();
  for ($a=0; $a<100000; $a++){
    // 何もしない。
  }
  $sTime = GetDelta($mtStart,microtime());
  echo "\t1 \$a++ ×$a $sTime 秒\n";

  // 2 ++前置
  $mtStart = microtime();
  for ($b=0; $b<100000; ++$b){
    // 何もしない。
  }
  $sTime = GetDelta($mtStart,microtime());
  echo "\t2 ++\$b ×$b $sTime 秒\n";

  // 3 ++前置 3文字変数名
  $mtStart = microtime();
  for ($cnt=0; $cnt<100000; ++$cnt){
    // 何もしない。
  }
  $sTime = GetDelta($mtStart,microtime());
  echo "\t3 ++\$cnt ×$cnt $sTime 秒\n";

  // 4 ++前置 & 長い変数名
  $mtStart = microtime();
  for ($counterForBigLoopWithLongName=0;
       $counterForBigLoopWithLongName<100000;
       ++$counterForBigLoopWithLongName){
    // 何もしない。
  }
  $sTime = GetDelta($mtStart,microtime());
  echo "\t4 ++\$counterForBigLoopWithLongName ×$
counterForBigLoopWithLongName $sTime 秒\n";

}
?>
</pre></BODY></HTML>