美文网首页PHP经验分享
代码优化和效率提升的方法(四)多出的4M内存哪儿去了?

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

作者: 公式般欢笑 | 来源:发表于2020-03-04 00:07 被阅读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要大得多。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/eplvkhtx.html