我们用一段代码来测试内存的占用情况:
<?php
$mem=memory_get_usage();
for($i=0;$i<1000000;$i++){
$arr[$i]=$i;
}
$mema=memory_get_usage();
$memused=$mema-$mem;
echo '++ memory used:',$mema-$mem,"\n";
$arr=[];
$mem=memory_get_usage();
for($i=1000000;$i>0;$i--){
$arr[$i]=$i;
}
$mema=memory_get_usage();
echo '--memory used:',$mema-$mem,"\n";
echo 'sub result(M):', ($mema-$mem-$memused)/1024/1024,"\n";
执行这段代码,可以得到如下的结果:
$ /program/bin/php/php7/bin/php arr.php
++ memory used:33558720
--memory used:37748928
sub result(M):3.99609375
可以看出,‘--’比‘++’多用了将近4M的内存。
为什么会出现这样的情况呢?
通过分析PHP的HashTable的源码可以看出,PHP的数组结构有两种,分别是packed array 和 hash array。
packed array的存储方式是直接将值压入对应的bucket中,其bucket的排列方向与数组下标一致。
hash array是先计算出一个hash值,先存储hash值,然后将其指向一个存储具体数据的bucket。
在我们的代码中,++的方式与packed array的存储方式一致,因此不需要计算哈希值,而--的方式最开始的下标过大,PHP会自动将其转存为hash array。因为多出了存储哈希值的内存块,所以内存必然要比packed array要大得多。
网友评论