【发布时间】:2018-05-01 23:59:36
【问题描述】:
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 使用写时复制。所以传递参数不需要复制。永远不需要使用引用来提高性能。仅当函数需要修改调用者的变量时才使用它们。
-
对于 "M2($var, $var)" 我认为 $var pass by ref 被复制了。所以 "M3($var, $var)" 应该复制 $var 两次,但实际上并没有发生。
-
可以看到这3个函数没有修改任何值。因此,对于您的结论,它们应该花费相同的时间来运行,但它们是不同的。 @Barmar
-
是的,我想我所说的对于普通变量来说是正确的。显然需要对参考变量进行特殊处理。
-
你运行了多少次以获得每个函数的平均值?
标签: php performance pass-by-reference