在PHP中,通过引用传递大量数据而不是通过值传递资源是否更少(更聪明)?

rdl*_*rey 4 php

可能重复:
在PHP(> = 5.0)中,更快地通过引用传递?

假设我正在处理一个大数据(有多大并不重要)数据数组并将其传递给函数.当然,它将通过值传递,而不是默认情况下通过引用传递.好的,我知道.

所以我的问题是:

如果存储在此数组中的数据足够大,则可以通过将数据存储在对象(例如,stdClass)中或通过使用foo(&$ myData)来获得有价值的性能或内存使用增益,以便通过引用传递数据而不是价值?

我的理解是,当它通过值传递时,PHP将创建一个全新的指针,指向数据的全新内存分配,而传递的值变量存在于函数范围中.在这种情况下,由于这个原因,可能通过引用传递大量数据是值得的吗?我不知道这种理解是否正确......这是问题的一部分.

注意:这是一个假设,所以不要提出任何关于"过早优化","你最好在最小化磁盘I/O然后再担心这个","取决于你有多少RAM","等等."

UPDATE

还有一个问题:假设数据被传递给一个对象构造函数,以便存储为该对象的一个​​属性,并且它会以一些小的方式被修改,因为它存储在新对象的属性中.那么操作的内存使用方面是否会有显着差异?假设最好以目标格式定义数据以避免因改变数据线而产生的成本,这是正确的吗?

eri*_*sco 6

我找不到任何正式的东西,但根据我的理解,Zend Engine只会在你尝试写入时复制数组.也就是说,以下代码中没有复制:

function printFirst($array) { echo $array[0]; }

$array = range(1,1000);
printFirst($array);
Run Code Online (Sandbox Code Playgroud)

但是,在此代码中,将进行复制,假设没有进行其他优化(即:此示例函数不执行任何操作,因此可以完全排除).

function changeFirst($array) { $array[0] = 101; }

$array = range(1,1000);
changeFirst($array);
Run Code Online (Sandbox Code Playgroud)

所以回答你的问题,不,通过引用传递不会有任何区别.如果你真的需要修改原件,那么当然你需要一个参考.

注意,我在这里发现了一个重复的问题:在PHP(> = 5.0)中,通过引用更快地传递? 在这里:PHP如何为变量分配和释放内存?

更新

这是我运行的代码,它演示了对象的大量内存使用情况,尽管没有数组本身那么多(大约2/3).

<?php

class A {

public $data;

public function __construct($data) {
        $this->data = $data;
        // slight change
        $this->data[0] += 1;
}

};

$baseUsage = memory_get_usage();
$array = range(1,1000);
$arrayUsage = memory_get_usage();
echo "Array took: ", $arrayUsage - $baseUsage, "\n";
$a = new A($array);
echo "Object took: ", memory_get_usage() - $arrayUsage;

?>
Run Code Online (Sandbox Code Playgroud)


Nie*_*sol 5

来自对Array数据类型的注释,PHP手册

确实,"数组赋值总是涉及值复制",但副本是"懒惰副本".这意味着只要没有数组元素发生更改,两个变量的数据就会占用相同的内存.

例如,如果你必须将一个数组传递给只需要读取它的函数,那么通过引用传递它就没有任何优势.