假设我正在处理一个大数据(有多大并不重要)数据数组并将其传递给函数.当然,它将通过值传递,而不是默认情况下通过引用传递.好的,我知道.
所以我的问题是:
如果存储在此数组中的数据足够大,则可以通过将数据存储在对象(例如,stdClass)中或通过使用foo(&$ myData)来获得有价值的性能或内存使用增益,以便通过引用传递数据而不是价值?
我的理解是,当它通过值传递时,PHP将创建一个全新的指针,指向数据的全新内存分配,而传递的值变量存在于函数范围中.在这种情况下,由于这个原因,可能通过引用传递大量数据是值得的吗?我不知道这种理解是否正确......这是问题的一部分.
注意:这是一个假设,所以不要提出任何关于"过早优化","你最好在最小化磁盘I/O然后再担心这个","取决于你有多少RAM","等等."
UPDATE
还有一个问题:假设数据被传递给一个对象构造函数,以便存储为该对象的一个属性,并且它会以一些小的方式被修改,因为它存储在新对象的属性中.那么操作的内存使用方面是否会有显着差异?假设最好以目标格式定义数据以避免因改变数据线而产生的成本,这是正确的吗?
我找不到任何正式的东西,但根据我的理解,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)
确实,"数组赋值总是涉及值复制",但副本是"懒惰副本".这意味着只要没有数组元素发生更改,两个变量的数据就会占用相同的内存.
例如,如果你必须将一个数组传递给只需要读取它的函数,那么通过引用传递它就没有任何优势.