我试图用一个基于我正在从事的项目的真实示例来对此进行基准测试。与往常一样,差异微不足道,但结果有些出乎意料。对于我见过的大多数基准测试,被调用的函数实际上并没有改变传入的值。我对其执行了一个简单的 str_replace() 。
**Pass by Value Test Code:**
$originalString=''; // 1000 pseudo-random digits
function replace($string) {
return str_replace('1', 'x',$string);
}
$output = '';
/* set start time */
$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);
}
}
/* report how long it took */
$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 更快,但可能没有那么快。)