PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?

Posted

技术标签:

【中文标题】PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?【英文标题】:Does PHP optimize function arguments of array type, not explicitly passed by reference, when they are not modified?PHP是否优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时? 【发布时间】:2016-03-22 23:34:51 【问题描述】:

php 引擎是否会优化第二个示例以通过引用传递$arr

function test1(array &$arr)

    $arr[] = 123;

    echo $arr[0];


function test2(array $arr)

    echo $arr[0];

【问题讨论】:

@u_mulder,避免复制整个数组并消耗更少的内存 数组会在需要时被复制。 如果您实际更改函数内部的值,传递给函数的参数只会被“复制”(编辑时复制) 【参考方案1】:

PHP 使用一种称为copy-on-write 的机制来完全避免过度复制变量,只要不需要这样做。因此,即使在您的 test2() 示例中,$array 也根本不会被复制。如果您在函数内部修改了$array,PHP 会复制该变量以允许修改。这个机制的详细解释可以在"PHP Internals Book"的"Memory Management"章节中找到。以下引用来自"Reference-counting and copy-on-write" 部分:

如果您稍微考虑一下上述内容,您就会得出结论 PHP 必须进行大量的复制。每次经过 需要将值复制到函数的某些内容。这可能不是 对于整数或双精度数特别有问题,但想象一下 将包含一千万个元素的数组传递给函数。复印 每次调用都有数百万个元素会非常慢。

为避免这样做,PHP 采用了写时复制范例:zval 可以 由多个变量/函数/等共享,只要它只是 读取而不修改。如果其中一位持有人想要修改它, 在应用任何更改之前需要复制 zval。

以下两篇文章提供了对该主题的更多见解(均由 PHP 核心开发人员撰写):

约翰内斯·施吕特:Do not use PHP references 萨拉戈莱蒙:You're being lied to

第一个甚至解释了为什么仅出于性能原因使用引用通常是一个坏主意:

人们使用参考的另一个原因是因为他们认为它使 代码更快。但这是错误的。更糟糕的是:主要是参考文献 让代码变慢!

是的,引用通常会使代码变慢 - 抱歉,我不得不这样做 重复此操作以使其清楚。

第二个展示了为什么在 PHP5+ 中对象没有真正通过引用传递。

【讨论】:

谢谢!我不认为我完全错了,但你肯定更正确:) 删除了我的答案。如果不修改大型数组,您认为通过引用传递大型数组会带来任何性能提升吗? @Will:查看我的更新答案。显式地通过引用传递变量并没有性能提升——更糟糕的是:它使代码变慢。我在某处读过:不要试图智取引擎

以上是关于PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?的主要内容,如果未能解决你的问题,请参考以下文章

想要在 PHP 中传递值列表(如在 Perl 中),而不是引用数组

PHP引擎是不是优化循环内的匿名函数?

Javascript 是不是通过引用或值将数组传递给函数?

php按值复制数组元素,而不是按引用

[PHP] 数据结构-线性表的顺序存储结构PHP实现

我们是不是应该在函数的参数中使用常量类型引用? [复制]