MELで変数$iをインクリメントをするとき、書き方として$i++、++$i、$i=$i+1, $i+=1の4つが考えられます。それぞれの書き方でforループを回したときに処理速度に変化が出るか実験してみました。
環境は以下です。
OS: Windows 7 64bit
CPU: core-i7 930 2.8GHz
Memory: 6GB
まずは最もスタンダードな$i++から。下記のコードを何回か実行してみました。
こちらの実行時間は4.25から4.4秒付近。
次に++$iです。
こちらも実行時間は4.25から4.4秒付近でした。$i++と変わらないです。
次に$i+=1です。
こちらは何回かやった結果5.8から6.3秒程度でした。ずいぶん遅くなりました。 最後に$i=$i+1です。
こちらは6.7から7.2秒くらいでした。さらに遅くなりました。
スクリプト言語だとコンパイラによる自動最適化がない分、同じ動作のものでも書き方の違いによって処理時間が大きく変わってくるんですね。おもしろい。
さらに実験を続けます。forのインクリメントの書く場所で処理速度に違いが出るかの実験です。
まずは通常通りforの()の中に書いた場合
これを30回計測して平均を取ったところ4.199667秒でした。
次にforの{}の中に書いた場合です。
こちらも同様に30回計測して平均をとったら4.376667秒でした。通常通り()の中に書いた方が速いみたいです。触れ幅も同じくらい差があったので誤差ではなさそうです。
ではwhileで書いた場合はどうなるか。それも実験してみました。
whileは30回平均が4.436秒でした。若干遅くなりましたが、おそらく触れ幅的に誤差かと思います。なのでwhileはforの{}にインクリメントを書くバージョンと同じくらいかと。
結論としては普通どおりにfor($i=0; $i<1000; $i++)みたいな書き方が一番速いということです。当たり前のことですが、こういう違いがあることを知っているのは大事なことだと思います。
また他の構文の違いによる速度比較実験もやってみたら結果を載せようと思います。
環境は以下です。
OS: Windows 7 64bit
CPU: core-i7 930 2.8GHz
Memory: 6GB
まずは最もスタンダードな$i++から。下記のコードを何回か実行してみました。
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; ){
$i++;
}
$totalTime = `timerX -startTime $startTime`;
こちらの実行時間は4.25から4.4秒付近。
次に++$iです。
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; ){
++$i;
}
$totalTime = `timerX -startTime $startTime`;
こちらも実行時間は4.25から4.4秒付近でした。$i++と変わらないです。
次に$i+=1です。
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; ){
$i+=1;
}
$totalTime = `timerX -startTime $startTime`;
こちらは何回かやった結果5.8から6.3秒程度でした。ずいぶん遅くなりました。 最後に$i=$i+1です。
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; ){
$i=$i+1;
}
$totalTime = `timerX -startTime $startTime`;
こちらは6.7から7.2秒くらいでした。さらに遅くなりました。
スクリプト言語だとコンパイラによる自動最適化がない分、同じ動作のものでも書き方の違いによって処理時間が大きく変わってくるんですね。おもしろい。
さらに実験を続けます。forのインクリメントの書く場所で処理速度に違いが出るかの実験です。
まずは通常通りforの()の中に書いた場合
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; $i++){}
$totalTime = `timerX -startTime $startTime`;
これを30回計測して平均を取ったところ4.199667秒でした。
次にforの{}の中に書いた場合です。
int $i=0;
$startTime = `timerX`;
for(; $i<100000000; ){ $i++; }
$totalTime = `timerX -startTime $startTime`;
こちらも同様に30回計測して平均をとったら4.376667秒でした。通常通り()の中に書いた方が速いみたいです。触れ幅も同じくらい差があったので誤差ではなさそうです。
ではwhileで書いた場合はどうなるか。それも実験してみました。
int $i=0;
$startTime = `timerX`;
while($i<100000000){ $i++; }
$totalTime = `timerX -startTime $startTime`;
whileは30回平均が4.436秒でした。若干遅くなりましたが、おそらく触れ幅的に誤差かと思います。なのでwhileはforの{}にインクリメントを書くバージョンと同じくらいかと。
結論としては普通どおりにfor($i=0; $i<1000; $i++)みたいな書き方が一番速いということです。当たり前のことですが、こういう違いがあることを知っているのは大事なことだと思います。
また他の構文の違いによる速度比較実験もやってみたら結果を載せようと思います。