gpt4 book ai didi

PHP 数组性能 - 内存方面

转载 作者:可可西里 更新时间:2023-11-01 12:34:22 26 4
gpt4 key购买 nike

我有一个大小为 5 MB 的数组,我正在将它传递给函数(我不是通过引用传递它)

foo( $arr );

function foo( $arr ) {
....
bar( $arr );
....
}

function bar( $arr ) {
....
test( $arr );
....
}

function test( $arr ) {
....
test2( $arr );
....
}

PHP 默认将数组值按值(值的副本)传递给函数。

我的问题是,如果将此数组值传递给 100 个函数调用,PHP 会消耗 100 x 5 MB = 500 MB 内存吗?

PHP 如何在函数调用时处理大数组(在内存方面)?

最佳答案

下面是测试代码:

<?php

function testnochanges($arr1){
foreach($arr1 as $val){
//
}
return $arr1;
}

function testwithchanges($arr1){
$arr1[] = 1;
return $arr1;
}

echo "Stage 0: Mem usage is: " . memory_get_usage() . "<br />";

for ($i = 0; $i < 100000; ++$i) {
$arr[] = rand();
}

echo "Stage 1 (Array Created): Mem usage is: " . memory_get_usage() . "<br />";


$arrtest1 = testnochanges($arr);
echo "Stage 2 (Function did NO changes to array): Mem usage is: " . memory_get_usage() . "<br />";

$arrtest2 = testwithchanges($arr);
echo "Stage 3 (Function DID changes to array): Mem usage is: " . memory_get_usage() . "<br />";


?>

这是我运行后的输出:

Stage 0: Mem usage is: 330656
Stage 1 (Array Created): Mem usage is: 8855296
Stage 2 (Function did NO changes to array): Mem usage is: 8855352
Stage 3 (Function DID changes to array): Mem usage is: 14179864

阶段 0 我们可以看到在创建数组之前 PHP 已经在使用内存中的一些空间。在创建第一个数组(Stage 1)后,我们可以看到内存使用情况发生了预期的巨大变化。但是在调用 testnochanges 函数并在 Stage 2 上创建 $arrtest1 之后,我们看到内存使用情况并没有太大变化。这是因为我们没有对 $arr 做任何更改,所以 $arrtest1$arr 仍然指向同一个数组。但是在第 3 阶段,我们调用 testwithchanges 函数,并将一个元素添加到 $arr PHP 执行 copy-on-write 和分配给 $arrtest2 的返回数组现在使用不同的内存部分,我们再次看到内存使用量大幅增长。

干巴巴的结论:如果您将数组复制到另一个数组并且不更改它,内存使用保持不变,因为两个数组都指向同一个数组。如果您更改数组,PHP 会执行写时复制,当然内存使用量会增加。

好东西要读:Be wary of garbage collection, part 2 .

关于PHP 数组性能 - 内存方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com