在PHP7中,在foreach中通过引用传递值真的对性能有用吗
自PHP7.0以来,对foreach循环进行了修改,并设置了一个新的行为以使引用比以前更快(foreach$tab为&$val) 但我已经读过很多次,通过引用传递实际上有时比公共循环(foreach$tab作为$val)慢 总是更快吗?总是比较慢吗?它是否取决于我们在foreach循环中所做的工作?因为PHP中的引用不是引用,所以很混乱。。。我有点厌倦了在网上阅读关于这个问题的不同答案,我不知道真相在哪里 谢谢你给我们带来了光明;) 资料来源: 资料来源: 资料来源:在PHP7中,在foreach中通过引用传递值真的对性能有用吗,php,performance,loops,foreach,reference,Php,Performance,Loops,Foreach,Reference,自PHP7.0以来,对foreach循环进行了修改,并设置了一个新的行为以使引用比以前更快(foreach$tab为&$val) 但我已经读过很多次,通过引用传递实际上有时比公共循环(foreach$tab作为$val)慢 总是更快吗?总是比较慢吗?它是否取决于我们在foreach循环中所做的工作?因为PHP中的引用不是引用,所以很混乱。。。我有点厌倦了在网上阅读关于这个问题的不同答案,我不知道真相在哪里 谢谢你给我们带来了光明;) 资料来源: 资料来源: 资料来源: 语言设计人员只是试图处理数
语言设计人员只是试图处理数组元素较大的情况,并在源代码中直接阐明将要发生的事情。现在,您可以告诉PHP,变量
$val
,将包含对数组元素的引用,这意味着大值不会被复制,内存垃圾收集器也不会有更多的工作要做,源代码清楚地说明了这一点。阅读此语句的后续程序员将确切地知道PHP将要做什么
当然,引用自然比在内存中复制值更有效。执行摘要:您担心的是一个不存在的性能问题 详细信息 PHP使用“COW”(写时复制) 正常传球(
$val
):
- 标量——传递值。写入它只会更改本地副本
- Structure/array/etc——将指针传递给它。如果接收器(
loop或foreach
body)想要更改结构的任何部分,则复制该结构。成本与结构的大小成正比function
和$val
):
- 标量——传递一个指向标量的指针,以便内部可以实际更改它
- 结构——传递指针。如果接收器写入结构,它只(有效地)通过指针到达结构中的项。没有奶牛
&$val
操作
PHP与几乎所有其他语言都不同
- ALGOL 60——传递值或“名称”(有点像新语言中的匿名函数)
- FORTRAN——仅通过“引用”(指针)传递。缺点是,如果传递一个文本,接收方可以更改该文本的值!(好吧,这是老编译器中的一个“bug”。)
- C——只传递值。但是你可以说(用语法)你想要指向这个东西的指针,然后在里面取消引用
- Pascal——值或引用,但与上面的任何内容都不相同(我忘记了细节)
- 如果传递的是标量,则使用
并遍历指针,可能会有微小的性能损失和$val
- 如果您正在传递一个结构,而不需要对其进行写入,则可能没有差异
- 如果您正在传递一个结构,并且确实需要对其进行写入,那么您应该根据是否希望保留更改而不是性能来决定如何传递它