PHP经验分享

代码优化和效率提升的方法(四)多出的4M内存哪儿去了?

2020-03-04  本文已影响0人  公式般欢笑

我们用一段代码来测试内存的占用情况:

<?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要大得多。

上一篇 下一篇

猜你喜欢

热点阅读