[英]PHP performance issue: pass referenced variable as non-ref parameter
function M1($x, $y){}
function M2(&$x, $y){}
function M3(&$x, &$y){}
$arr = ['a' => ['b' => range(1, 1000)]];
$ref_arr = &$arr['a'];
$var = $ref_arr['b'];
$ref = &$ref_arr['b'];
//N->N, N->N
//0.003000020980835 sec.
for($i = 0; $i < 10000; ++$i)
M1($var, $var);
//N->R, N->N (slow)
//0.59903407096863 sec.
for($i = 0; $i < 10000; ++$i)
M2($var, $var);
//N->R, N->R
//0.003000020980835 sec.
for($i = 0; $i < 10000; ++$i)
M3($var, $var);
//R->N, R->N (very slow)
//1.1980690956116 sec.
for($i = 0; $i < 10000; ++$i)
M1($ref, $ref);
//R->R, R->N (slow)
//0.58603405952454 sec.
for($i = 0; $i < 10000; ++$i)
M2($ref, $ref);
//R->R, R->R
//0.003000020980835 sec.
for($i = 0; $i < 10000; ++$i)
M3($ref, $ref);
據我所知,當將引用變量作為非引用參數傳遞時,PHP 將復制該值。 所以這條線花費的時間最長。
M1($ref, $ref); //1.1980690956116 秒。
但是如何解釋這兩條線的性能呢?
M2($var, $var); //0.59903407096863秒。
M3($var, $var); //0.003000020980835秒。
幾年后沒有人給我答案,所以我決定自己回答。
原因仍然是 PHP 中的 COPY-ON-WRITE 機制,但是當傳遞具有不同引用類型的參數時,復制發生在函數調用開始之前。
定義:
這 3 種形式不會觸發參數復制:
對於這兩種形式,總是會發生參數復制。
因此,當您決定調用帶有引用參數的函數(通常是sort
、 reset
等數組函數)時,傳遞引用計數大於 1 的數組並不是一個好主意。
不好的例子:
$arr1 = [];
$arr2 = $arr1;
sort($arr1);
很好的例子:
$arr1 = [];
$arr2 = $arr1;
unset($arr2);
sort($arr1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.