PHPってインタプリタだけど中間コード生成するよなあ〜その際にオプチマイズってしてくれるのかな〜
PHPってよくいえば律儀にインタプリトするのね・・・ちょっと高速化を考慮したコーディングしないと駄目ですね。
<?php
require_once("Benchmark/Iterate.php");
define(MAX_RUN, 5000);
$data = array();
for ($i=0; $i<100; $i++) {
$data[$i] = $i;
}
header("Content-Type: text/html;charset=euc-jp");
echo "<html>\n";
echo "<head>\n";
echo "<title>Benchmark</title>\n";
echo "</head>\n";
echo "<body>\n";
echo '【ループ】<br>';
echo '- count を毎回コールする<br>';
doBenchmark('loop1', $data, 5000);
echo '- ループの前にカウントしておく<br>';
doBenchmark('loop2', $data, 5000);
echo '- foreach を使う<br>';
doBenchmark('loop3', $data, 5000);
echo '<br>';
echo '【配列】<br>';
echo '- array_push を使う<br>';
doBenchmark('array1', $data, 1000);
echo '- [] を使う<br>';
doBenchmark('array2', $data, 1000);
echo '<br>';
echo '【インクリメント】<br>';
echo '- $i++ を使う<br>';
doBenchmark('inc1', $data, 2000);
echo '- ++$i を使う<br>';
doBenchmark('inc2', $data, 2000);
echo "</body>\n";
echo "</html>\n";
exit;
/**
* ベンチマーク関数
*
* @param function $sFuncName 関数名
* @param array $aryData 関数に渡す配列
* @param integer $iCount 実行回数
*/
function doBenchmark($sFuncName=null, $aryData=null, $iCount=MAX_RUN)
{
reset($aryData);
$benchmark = new Benchmark_Iterate;
$benchmark->run($iCount, $sFuncName, $aryData);
$result = $benchmark->get();
printf("%s を %d 回実行した際にかかった時間: %.5f ms<br>",
$sFuncName,
$result['iterations'],
$result['mean'] * 1000);
}
// count を毎回コールする
function loop1($aryData = null)
{
for ($i =0; $i < count($aryData); $i++) {
$sum += $aryData[$i];
}
}
// ループの前にカウントしておく
function loop2($aryData = null)
{
$max = count($aryData);
for ($i =0; $i < $max ; $i++) {
$sum += $aryData[$i];
}
}
// foreach を使う
function loop3($aryData = null)
{
foreach ($aryData as $data) {
$sum += $data;
}
}
// array_push を使う
function array1($aryData = null)
{
$aryBuff = array();
foreach ($aryData as $data) {
array_push($aryBuff, '<!-- '.$data.' -->');
}
}
// [] を使う
function array2($aryData = null)
{
$aryBuff = array();
foreach ($aryData as $data) {
$aryBuff[] = '<!-- '.$data.' -->';
}
}
// $i++ を使う
function inc1($aryData = null)
{
$aryBuff = array();
foreach ($aryData as $data) {
$i++;
}
}
// ++$i を使う
function inc2($aryData = null)
{
$aryBuff = array();
foreach ($aryData as $data) {
++$i;
}
}
?>