Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP阵列性能-内存方面_Php - Fatal编程技术网

PHP阵列性能-内存方面

PHP阵列性能-内存方面,php,Php,我有一个大小为5 MB的数组,我将它传递给函数到函数(我不是通过引用传递它) 默认情况下,PHP将数组值按值传递给函数 我的问题是,如果将这个数组值传递给100个函数调用,PHP会消耗100x5MB=500MB内存吗 PHP如何处理函数调用中的大数组(在内存方面)?下面是要测试的代码: <?php function testnochanges($arr1){ foreach($arr1 as $val){ // }

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

默认情况下,PHP将数组值按值传递给函数

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


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


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

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


值得一读:。

真正了解您的特定用例执行情况的唯一方法是完成一个基准测试(快速和肮脏是好的)。如果您在性能方面遇到问题,您可能需要研究SPL。例如,
SplFixedArray
可以在处理较大的数组时节省内存,前提是您事先知道数组的大小。此外,较新版本的PHP处理垃圾收集的能力比以前的版本要好得多,因此升级也可能有所帮助

如果您决定运行基准测试,这将让您开始(将SPL与原始阵列进行比较):

无法告诉您,但您可能希望了解迭代器和foreach循环,这样您可能会有更好的内存消耗。您可以通过了解。如果您感兴趣,可以进一步了解本操作。下面是对幕后情况的解释。有趣。。。只有当我们改变它时,内存才会被分配,这是学习的好机会。谢谢@SuVeRa我用新的代码和新的测试编辑了答案,以确保它如何准确地与函数一起工作。
<?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