php - 返回值还是修改引用?

标签 php performance pass-by-reference pass-by-value choice

我以前见过这两种情况,据我所知,它非常主观,但如果给你选择,你会选择哪种?为什么?如果数据很大,其中之一会有任何速度/内存优势吗?

function processData(&$data_to_process) { // Pass by reference.
    // do something to the data
}

// ... somewhere else

$this->processData($some_data);

function processData($data_to_process) { // Pass by value.
    // do something to the data
    return $data_to_process;
}

// ... somewhere else

$some_data = $this->processData($some_data);

最佳答案

PHP 在写入时复制,因此如果数据在函数中没有改变,使用引用只会让事情运行得更慢。

在您的情况下,您正在更改数据,因此会发生复制。使用以下内容进行测试:

<?php

define('N', 100000);
$data = range(1, N);
srand(1);

function ref(&$data)
{
        $data[rand(1, N)] = 1;
}

function ret($data)
{
        $data[rand(1, N)] = 1;
        return $data;
}

echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";

ref($data);
// $data = ret($data);

echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";

?>

使用 ref() 运行一次,使用 ret() 运行一次。我的结果:

引用()

  • 8043280(之前/现在)
  • 8044188(前/峰)
  • 8043300(之后/当前)
  • 8044216(后/峰)

返回()

  • 8043352(之前/现在)
  • 8044260(前/峰)
  • 8043328(之后/当前)
  • 12968632(后/高峰)

因此,如您所见,PHP 在函数中修改数据并返回时使用了更多的内存。所以最佳情况是通过引用传递。

但是,如果按引用传递的发生并不明显,则它可能很危险。通常,您可以通过将数据封装在修改自身数据的类中来完全避免这个问题。

请注意,如果您使用对象,PHP5 总是通过引用传递它们。

关于php - 返回值还是修改引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644701/

相关文章:

php - 从 codeigniter 中的巨型查询中获取结果

java - 如何增加从java数据库中获取特定值的时间?

python - 在pandas中展开dataFrame

php - 使用 Doctrine ORM 统计表的所有记录

php - WordPress 对 WP_Query 返回的帖子进行排序

php - Mongodb _id以及如何在php中实现以在集合之间进行引用

python - 如何提高以下 python 代码的性能

C++在函数内分配动态数组

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

string - 在函数调用中发送 QString 的最佳方法是什么?