-PHP Tips- 第2回 値渡しと参照渡し

値渡しだとメモリのコピーを伴うので、参照渡しより遅いよね?
【Tips】phpだと値渡しの方が高速!
【Description】参照渡しの方が5割ぐらい遅い結果が。常識的に言って参照渡しの方が高速なはずなんですが、何故でしょう?
業務連絡:すまん、嘘ついたかも(笑)。

<?php
define("WORK_TIME", 20000);

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

function func_by_val($val){
    substr($val, 0, strlen($val) - 1);
}

function func_by_ref(&$val){
    substr($val, 0, strlen($val) - 1);
}

$to_test = <<<EOF
<img src="http://img.yahoo.co.jp/images/clear.gif" width=180 height=1>
</td><td>
<table cellpadding=2 cellspacing=0 border=0 width="100%">
<tr>
<td bgcolor="#eeeecc"><a name="主なトピックス"> <font size=3><b>主なトピックス</b></font></a></td></tr></table>
<table cellpadding=2 cellspacing=0 border=0 width="100%">
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#ffffff"><a href="http://dailynews.yahoo.co.jp/fc/domestic/weather" >低気圧で北日本大荒れに</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#ffffff"> <small><nobr>5日 18時51分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#eeeeee"><a href="http://dailynews.yahoo.co.jp/fc/economy/theme_parks" >TDLスペース・マウンテン脱輪</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#eeeeee"> <small><nobr>6日 0時10分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#ffffff"><a href="http://dailynews.yahoo.co.jp/fc/domestic/animal_issues" >「イルカセラピー」中止を表明</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#ffffff"> <small><nobr>5日 21時59分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#eeeeee"><a href="http://dailynews.yahoo.co.jp/fc/economy/mobile_phone" >携帯純増数の7割超はau</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#eeeeee"> <small><nobr>5日 22時57分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#ffffff"><a href="http://dailynews.yahoo.co.jp/fc/sports/j_league" >J1神戸、ビスマルクら戦力外</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#ffffff"> <small><nobr>5日 23時19分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#eeeeee"><a href="http://dailynews.yahoo.co.jp/fc/sports/fifa_world_cup_2006" >W杯予選、日本の相手どこに</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#eeeeee"> <small><nobr>5日 17時27分 </nobr></small></td></tr>
<tr><td width="2%" valign=top><img height=16 width=16 align=left src="http://img.yahoo.co.jp/images/news/fc.gif"></td>
<td width="60%" bgcolor="#ffffff"><a href="http://dailynews.yahoo.co.jp/fc/entertainment/game" >業務用「インベーダー」再出荷</a><img src="http://img.yahoo.co.jp/images/new2.gif" width=28 height=11 alt="[new]" border=0></td><td width="38%" align=right bgcolor="#ffffff"> <small><nobr>5日 21時14分 </nobr></small></td></tr></table>
EOF;

//ByRefの場合
$start_time = getmicrotime();
for($i = 0; $i < WORK_TIME; $i++){
    func_by_ref($to_test);
}
$by_ref_time = sprintf("%.4f", getmicrotime() - $start_time);

//ByValの場合
$start_time = getmicrotime();
for($i = 0; $i < WORK_TIME; $i++){
    func_by_val($to_test);
}
$by_val_time = sprintf("%.4f", getmicrotime() - $start_time);
?>
<html>
<head><title>ByValとByRefの比較</title></head>
<body>
substr()の対象となる文字列:<?php echo(nl2br(htmlspecialchars($to_test)));?>
<hr>
ByRefの結果:<?php echo($by_ref_time);?>秒<br>
ByValの結果:<?php echo($by_val_time);?>秒<br>
</body>
</html>
タイトルとURLをコピーしました