在 PHP (>= 5.0) 中,通过引用传递速度更快吗?

2022-08-30 08:36:21

在 PHP 中,通过在函数声明中的参数前附加一个 & 符号,可以通过引用传递函数参数,如下所示:

function foo(&$bar)
{
    // ...
}

现在,我知道这不是为了提高性能而设计的,而是允许函数更改通常超出其范围的变量。

相反,PHP似乎使用“写入时复制”来避免复制对象(可能还有数组),直到它们被更改。因此,对于不更改其参数的函数,效果应与通过引用传递它们时相同。

但是,我想知道“写入时复制”逻辑是否在按引用传递时可能短路,以及这是否会对性能产生任何影响。

ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是参考的用途。所以我认为我自己的猜测非常好,我只是在寻找一个真正知道引擎盖下肯定发生了什么的人的答案。在 PHP 开发的五年中,我总是发现很难通过阅读源代码来获得有关 PHP 内部的高质量信息。


答案 1

在调用字符串为 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

结论

  1. 按值传递参数始终更快

  2. 如果函数更改传递的变量的值,则出于实际目的,与通过引用传递而不是按值传递相同


答案 2

Zend 引擎使用写入时复制,当您自己使用引用时,它会产生一些额外的开销。不过,只有在撰写本文时才能找到此提及,并且手册中的评论包含其他链接。

(编辑)“对象和引用”手册页包含有关对象变量与引用有何不同的更多信息。


推荐