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