在PHP 7中的foreach中通过引用传递值对性能真的有用吗?

时间:2018-11-12 10:54:05

标签: php performance loops foreach reference

自PHP7.0起,foreach循环已被修改,并且设置了新的行为以使引用比以前更快(foreach $ tab为&$ val)。

但是我已经读过很多遍了,引用传递实际上有时比普通循环慢(将$ tab用作$ val)

它总是更快吗?总是慢一些?它是否取决于我们在foreach循环中正在做什么?由于PHP中的引用不是引用,因此令人困惑...我有点讨厌在网络上阅读有关该主题的不同答案,而我无法弄清事实的真相。

感谢您在这里带来一些启发;)

资料来源:https://blog.eduonix.com/web-programming-tutorials/learn-changes-foreach-statement-php-7/ 资料来源:http://php.net/manual/fr/control-structures.foreach.php 资料来源:http://php.net/manual/en/language.references.arent.php ...

2 个答案:

答案 0 :(得分:1)

执行摘要:您担心的是不存在的性能问题。

详细信息

PHP使用“ COW”(写时复制)。

正常通过($val):

  • 标量-传递值。对其进行写入只会更改本地副本。
  • Structure / array / etc-传递指向它的指针。如果接收方(foreach循环或function主体)想要更改结构的任何部分,则复制该结构。成本与结构的大小成正比。

通过引用传递(&$val):

  • 标量-将指针传递到标量,以便内脏可以实际更改它。
  • 结构-传递指针。如果接收者写入结构,则它简单地(有效地)通过指针到达结构中的项。没有牛。

设计中的智慧是,PHP在99%的时间内“有效”,是有效的,用户不需要知道有两种传球技巧。棘手的部分是您需要了解何时进行&$val这件事。

PHP与几乎所有其他语言相比

  • ALGOL 60-按值或“名称”传递(类似于新语言中的匿名函数)
  • FORTRAN-仅通过“引用”(指针)传递。缺点是,如果您传递文字,接收方可以更改文字的值! (好的,那是旧编译器中的一个“ bug”。)
  • C-仅按值传递。但是您可以(使用语法)说出您想要指向事物的指针,然后在内部取消引用。
  • 帕斯卡-值或参考,但与上面的内容不同(我忘记了细节)。

似乎“传递参数”的方法几乎和语言一样多。

返回问题:

  • 如果您要传递标量,则使用&$val并通过指针可能会对性能造成微小的影响。
  • 如果您要传递结构而无需写入结构,则差异可能为零。
  • 如果您要传递结构,而 do 需要写给它,那么您应该根据是否要保留更改来决定如何传递它, not < / em>性能。

答案 1 :(得分:0)

语言设计者只是在尝试处理数组元素的情况,并直接在源代码中明确说明将要发生的情况。现在,您可以告诉 PHP了,变量$val将包含对array-element的引用,这意味着将不会重复使用big-value,并且会浪费内存,收集器将没有更多的工作要做,并且源代码清楚地表明了这一点。随后的程序员阅读此语句将确切地知道PHP将要做什么。

当然,引用自然比在内存中复制值更有效。