我尝试通过一个基于我正在工作的项目的实际例子来进行基准测试。与往常一样,差异微不足道,但结果有些出乎意料。对于我看到的大多数基准测试,被调用的函数实际上并没有改变传入的值。我对其执行了一个简单的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更快,但可能不会快那么多。)