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



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

但我读过很多次,通过引用传递实际上有时比普通循环(foreach$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…

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

详细信息

PHP使用"COW"(写时复制(。

正常通过($val(:

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

通过参考(&$val(:

  • 标量—传递一个指向标量的指针,以便内部可以实际更改它
  • 结构--传递指针。如果接收器写入该结构,它只需(有效地(遍历指针即可到达该结构中的项。无COW

设计中的智慧是,99%的时间PHP"只是工作",是高效的,用户不需要知道有两种传递技术。棘手的部分是,您需要了解何时执行&$val

PHP与几乎所有其他语言都有不同

  • ALGOL 60——通过值或"名称"传递(有点像新语言中的匿名函数(
  • FORTRAN——仅通过"引用"(指针(传递。一个缺点是,如果您传递一个文本,接收器可以更改文本的值!(好吧,这是老编译器中的一个"bug"。(
  • C——只传递值。但你可以(用语法(说,你想要指向这个东西的指针,然后在里面取消引用
  • Pascal——值或引用,但与上面的任何内容都不相同(我忘记了细节(

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

返回问题:

  • 如果您正在传递标量,则使用&$val并遍历指针可能会对性能造成很小的损失
  • 如果您正在传递一个结构,而不需要对其进行写入,则可能没有任何差异
  • 如果您正在传递一个结构,并且确实需要对其进行写入,那么您应该根据是否希望保留更改来决定如何传递它,而不是根据性能来决定

语言设计人员只是试图处理数组元素大的情况,并直接在源代码中明确会发生什么。现在,您可以告诉PHP,变量$val将包含对数组元素的引用,这意味着大值不会重复,内存垃圾收集器也不会有更多的工作要做,源代码清楚地表明了这一点。阅读此语句的后续程序员将确切地知道PHP将要做什么。

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

最新更新