簡體   English   中英

PHP 性能問題:將引用的變量作為非引用參數傳遞

[英]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 機制,但是當傳遞具有不同引用類型的參數時,復制發生在函數調用開始之前。

定義:

  • N 表示非引用變量
  • R 表示 ref 變量
  • -> 用於參數傳遞

這 3 種形式不會觸發參數復制:

  • N -> N
  • R -> R
  • N(參考計數 = 1)-> R

對於這兩種形式,總是會發生參數復制。

  • R -> N
  • N(參考計數 > 1)-> R

因此,當您決定調用帶有引用參數的函數(通常是sortreset等數組函數)時,傳遞引用計數大於 1 的數組並不是一個好主意。

不好的例子:

$arr1 = [];
$arr2 = $arr1;
sort($arr1);

很好的例子:

$arr1 = [];
$arr2 = $arr1;
unset($arr2);
sort($arr1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM