当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在PHP(>=5.0)中,通过引用更快地传递?》经验,为你挑选了4个好方法。

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

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

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

相反,PHP似乎使用Copy On Write来避免复制对象(也可能是数组),直到它们被更改为止.因此,对于不更改其参数的函数,效果应与通过引用传递它们的效果相同.

但是,我想知道Copy On Write逻辑是否可能在传递引用时短路,以及是否会对性能产生任何影响.

ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的内容.所以我认为我自己的猜测非常好,我只是想找一个真正知道发生在幕后的人的回答.在PHP开发的五年中,我总是发现很难通过阅读源来获得PHP内部的高质量信息.



1> ikary..:

在使用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

结论

    按值传递参数总是更快

    如果函数更改传递的变量的值,则实际用途与按引用传递的值相同而不是按值传递


这是很好的信息,但我很好奇:您使用什么版本的PHP进行此测试?
这没有多大意义.这是一些真正非常低效的参考处理.

2> Paul Dixon..:

Zend引擎使用copy-on-write,当你自己使用引用时,会产生一些额外的开销.只能在撰写本文时提及此提及,并且手册中的注释包含其他链接.

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


只有在您从未操纵原始数据结构时,才会出现(有点学术性)整体性能损失.当你计划,你实际上应该*获得*性能,因为你避免了写时复制.
所以你说它实际上会伤害性能(即使影响可能非常微不足道)?这很有意思,谢谢!
是的,被授予,这是一个小学术.我只是因为误解了PHP内部的工作方式而感到非常沮丧,这让我对发现有点迂腐.在我看来,PHP内部的良好来源比其他语言(如Python)更难找到

3> Petah..:

我对此进行了一些测试,因为我不确定给出的答案.

我的结果表明,通过引用IS传递大型数组或字符串的速度要快得多.

这是我的结果: 基准

Y轴(运行)是在1秒*10内调用函数的次数

对于每个功能/变量,测试重复8次

以下是我使用的变量:

$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a');
$small_array = array('this', 'is', 'a', 'small', 'array');
$large_object = (object)$large_array;
$large_string = str_repeat('a', 100000);
$small_string = 'this is a small string';
$value = PHP_INT_MAX / 2;

这些是功能:

function pass_by_ref(&$var) {
}

function pass_by_val($var) {
}



4> 小智..:

我已经尝试了10k字节字符串的值和引用,将它传递给两个相同的函数.一个通过值进行参数,第二个通过引用进行.它们是常用函数 - 接受参数,进行简单处理并返回值.我做了两万次调用,并发现引用并不是为了提高性能 - 参考利润接近4-5%,只有当字符串变得足够大时才会增长(100k及更长时间,提高了6-7%) .所以,我的结论是不使用引用来提高性能,这个东西不是为了那个.

我使用的是PHP Version 5.3.1

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有