在PHP中,函数参数可以通过在函数声明中的参数前加一个&符号来引用,如下所示:
function foo(&$bar) { // ... }
现在,我知道这不是为了提高性能,而是为了允许函数更改通常超出其范围的变量.
相反,PHP似乎使用Copy On Write来避免复制对象(也可能是数组),直到它们被更改为止.因此,对于不更改其参数的函数,效果应与通过引用传递它们的效果相同.
但是,我想知道Copy On Write逻辑是否可能在传递引用时短路,以及是否会对性能产生任何影响.
ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的内容.所以我认为我自己的猜测非常好,我只是想找一个真正知道发生在幕后的人的回答.在PHP开发的五年中,我总是发现很难通过阅读源来获得PHP内部的高质量信息.
在使用20 KB的字符串调用函数进行100 000次迭代的测试中,结果如下:
pass by value: 0.12065005 seconds pass by reference: 1.52171397 seconds
pass by value: 1.52223396 seconds pass by reference: 1.52388787 seconds
按值传递参数总是更快
如果函数更改传递的变量的值,则实际用途与按引用传递的值相同而不是按值传递
Zend引擎使用copy-on-write,当你自己使用引用时,会产生一些额外的开销.只能在撰写本文时提及此提及,并且手册中的注释包含其他链接.
(编辑)对象和引用的手册页包含有关对象变量与引用如何不同的更多信息.
我对此进行了一些测试,因为我不确定给出的答案.
我的结果表明,通过引用IS传递大型数组或字符串的速度要快得多.
这是我的结果:
Y轴(运行)是在1秒*10内调用函数的次数
对于每个功能/变量,测试重复8次
以下是我使用的变量:
$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a'); $small_array = array('this', 'is', 'a', 'small', 'array'); $large_object = (object)$large_array; $large_string = str_repeat('a', 100000); $small_string = 'this is a small string'; $value = PHP_INT_MAX / 2;
这些是功能:
function pass_by_ref(&$var) { } function pass_by_val($var) { }
我已经尝试了10k字节字符串的值和引用,将它传递给两个相同的函数.一个通过值进行参数,第二个通过引用进行.它们是常用函数 - 接受参数,进行简单处理并返回值.我做了两万次调用,并发现引用并不是为了提高性能 - 参考利润接近4-5%,只有当字符串变得足够大时才会增长(100k及更长时间,提高了6-7%) .所以,我的结论是不使用引用来提高性能,这个东西不是为了那个.
我使用的是PHP Version 5.3.1