下面是测试代码:
<?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是已经在内存中使用了一些空间。在创建第一个阵列后(阶段1),我们可以看到预期的内存使用量有很大变化。但在调用功能testnochanges
函数并在阶段2上创建$arrtest1
后,我们看到内存使用情况没有太大变化。这是因为我们没有更改$arr
,所以$arrtest1
和$arr
仍然指向相同的阵列。但是在阶段3,我们调用testwithchanges
函数,并添加一个元素到$arr
PHP执行copy-on-write
和返回的数组被分配到$arrtest2
现在使用不同的内存部分,我们再次看到内存使用量的增长。
结论:如果将数组复制到另一个数组并且不更改它,内存使用率保持不变,因为两个数组都指向同一个数组。如果你改变数组PHP执行copy-on-write
,当然内存使用增长。
好东西阅读:Be wary of garbage collection, part 2。
来源
2012-10-03 06:05:54
F0G
不能告诉你,但你可能要考虑的迭代器和foreach循环,你可能这种方式有更好的内存消耗。 –
你可以通过http://www.php.net/manual/en/function.memory-get-usage.php找到。 –