PHP数组性能 - 内存明智

SuV*_*eRa 8 php

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

foo( $arr );

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

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

function test( $arr ) {
    ....
    test2( $arr );
    ....
}
Run Code Online (Sandbox Code Playgroud)

PHP 默认情况下通过值(值的副本)将数组值传递给函数.

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

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

F0G*_*F0G 7

这是一个要测试的代码:

<?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 />";


    ?>
Run Code Online (Sandbox Code Playgroud)

这是我运行后的输出:

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
Run Code Online (Sandbox Code Playgroud)

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

干结论:如果将数组复制到另一个数组并且不更改它,则内存使用保持不变,因为两个数组都指向同一个数组.如果你更改PHP执行的数组copy-on-write,当然内存使用量会增加.

好看的东西:警惕垃圾收集,第2部分.