6

说如果这是代码:

function bar() {
    $result = array();
    for ($i = 0; $i < 1000; $i++) {
        $result[] = $i * 10;
    }
    return $result;
}

$ha = bar();
print_r($ha);

因为它是“按值返回”,所以返回这样的大数组是否效率不高?(假设不是 1000 而是 1000000)。因此,为了改进它,我们是否将第一行更改为:

function &bar() {

也就是说,只需&在函数名称前添加一个 - 如果返回一个大数组,这是一种正确且首选的方式吗?

4

5 回答 5

8

关于 PHP 如何处理变量存储存在很多误解。由于 PHP 是“写入时复制”,因此无需创建“引用”(实际上是符号表别名)来节省空间或时间。事实上,这样做会伤害你。如果您想将其用作某事物的别名,您应该只在 PHP 中创建一个引用。我运行了你的两个片段,看起来第二个实际上使用了更多的内存(虽然不是很多)。

顺便说一句,1000 个整数的数组很小

于 2012-05-02T00:15:58.187 回答
5

由于 COW,它们消耗的内存完全相同

  1. http://ideone.com/bZgm7
  2. http://ideone.com/e3Jfr

PS:要通过引用获得“真实”传递,您还需要在作业中添加它:

$ha =& bar();
于 2012-05-02T00:15:40.930 回答
3

如果你在memory_get_peak_usage()函数内外都抛出 a ,你会看到返回数组并不会增加内存。

PHP 在写入时复制。在这种情况下,即使你写了也没有什么可复制的,因为原始变量超出了范围。所以不,没有理由这样做。

事实上,在 PHP 中,通常没有理由使用引用,除非您需要它们提供的功能:更改原始变量。

于 2012-05-02T00:16:07.513 回答
1

官方手册页说:当您想使用函数查找应该将引用绑定到哪个变量时,通过引用返回很有用。不要使用按引用返回来提高性能。引擎会自行自动优化。仅在您有正当的技术理由时才返回参考资料

http://it2.php.net/manual/en/language.references.return.php

所以,在你的情况下,不要使用它。

于 2012-05-02T00:20:03.097 回答
0

那这个呢?

function bar($result) {
    $result = array();
    for ($i = 0; $i < 1000; $i++) {
        $result[] = $i * 10;
    }
}

bar(&$ha);
print_r($ha);
于 2012-05-02T00:16:06.280 回答