[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>