我试图根据我正在研究的项目的真实示例对它进行基准测试。和往常一样,差异很小,但是结果有些出乎意料。对于我所见过的大多数基准测试,被调用函数实际上并不会更改传入的值。我对其执行了一个简单的str_replace()。
**Pass by Value Test Code:**
$originalString='';
function replace($string) {
return str_replace('1', 'x',$string);
}
$output = '';
$mtime = microtime();
$mtime = explode(" ", $mtime);
$mtime = $mtime[1] + $mtime[0];
$tstart = $mtime;
set_time_limit(0);
for ($i = 0; $i < 10; $i++ ) {
for ($j = 0; $j < 1000000; $j++) {
$string = $originalString;
$string = replace($string);
}
}
$mtime = microtime();
$mtime = explode(" ", $mtime);
$mtime = $mtime[1] + $mtime[0];
$tend = $mtime;
$totalTime = ($tend - $tstart);
$totalTime = sprintf("%2.4f s", $totalTime);
$output .= "\n" . 'Total Time' .
': ' . $totalTime;
$output .= "\n" . $string;
echo $output;
通过参考测试代码
一样,除了
function replace(&$string) {
$string = str_replace('1', 'x',$string);
}
replace($string);
以秒为单位的结果(1000万次迭代):
PHP 5
Value: 14.1007
Reference: 11.5564
PHP 7
Value: 3.0799
Reference: 2.9489
每次函数调用的差别只有几分之一毫秒,但是对于这种用例,在PHP 5和PHP 7中按引用传递都更快。
(注意:PHP 7测试是在更快的计算机上进行的-PHP 7更快,但可能没有那么快。)