私が取り組んでいたプロジェクトに基づく実際の例で、これをベンチマークしようとしました。いつものように違いは些細なことですが、結果はやや予想外でした。私が見たほとんどのベンチマークでは、呼び出された関数は渡された値を実際には変更しません。単純な 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
その違いは、関数呼び出しごとに数分の 1 ミリ秒ですが、このユース ケースでは、PHP 5 と PHP 7 の両方で参照渡しの方が高速です。
(注: PHP 7 のテストは、より高速なマシンで実行されました。PHP 7 の方が高速ですが、おそらくそれほど高速ではありません。)