最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP 中集中合并数组的方法的性能以及内存消耗的比较

    正文概述 转载于:掘金(YanChen11)   2021-06-28   379

      在 php 中实现数组的合并,常用的方法有两种:

    • 直接使用 array_merge ,这种方法虽然做到了代码的简洁,但却大大增加了内存的开销,同时拖慢了 PHP 的性能。
    • 对数组进行遍历,将数组中的值逐个追加到结果数组中,相较直接使用 array_merge ,这种方法虽然增加了代码量,却降低了 PHP 的内存开销,同时提升了性能。

    ⒈ 代码实现

    /**
        用 PHP 实现将一个二维数组合并为一个一维数组
    */
    // 数组的长度
    $len = $argv[1];
    
    $start = 0;
    $arr = [];
    // 数组初始化
    while ($start < $len) {
        $arr[$start] = range(1, $len);
        $start ++;
    }
    // 采用 array_merge 的方式合并数组
    function merge1 (array $input)
    {
        $results = [];
    
        foreach ($input as $item) {
            $results = array_merge($results, $item);
        }
    
        return $results;
    }
    // 采用 array_push 的方式合并数组
    function merge2 (array $input) 
    {
        $results = [];
    
        foreach ($input as $item) {
            foreach ($item as $v) {
                array_push($results, $v);
            }
        }
    
        return $results;
    }
    // 采用元素追加的方式合并数组
    function merge3(array $input)
    {
        $results = [];
    
        foreach ($input as $item) {
            foreach ($item as $v) {
                $results [] = $v;
            }
        }
    
        return $results;
    }
    
    echo microtime(), PHP_EOL;
    $res = merge3($arr);
    echo microtime(), PHP_EOL;
    
    echo memory_get_usage(), PHP_EOL;
    echo memory_get_peak_usage(), PHP_EOL;
    

    ⒉ 运行结果比较

    数组长度 array_merge array_push 元素追加 内存消耗(B) 运行时间(㎲) 内存消耗(B) 运行时间(㎲) 内存消耗(B) 运行时间(㎲) 5 432,440 20 433,200 25 433,200 19 50 764,704 322 629,736 141 629,736 102 500 27,434,944 897,422 19,042,416 11,294 19,042,416 8,182 5,000 3,479,599,136 904,476,129 2,405,853,392 1,266,203 2,405,853,392 1,022,328

    ⒊ 原因分析

    1. 使用 array_merge ,每调用一次,都需要为 array_merge 的结果数组分配新的内存空间(PHP 采用的是写时复制的机制,而 array_merge 不会对参数进行写操作,所以每次调用时并不需要为入参重新分配内存)。随着数组长度的增加,调用 array_merge 的次数也会增加,重新分配内存的次数也会增加,同时结果数组的长度不断增加,每次所需要分配的内存空间也会随着增加,这就需要消耗大量的内存。同时,频繁的分配/销毁内存,导致 PHP 的性能下降。

    2. 使用 array_push ,只需要对结果数组分配一次内存,之后会一直往结果数组中追加元素。PHP 数组的底层实现方式为 hashtable,并且在初始化时会为 hashtable 分配 8 个长度的 bucket,每个 bucket 存储一个数组元素。当现有的 bucket 用完之后,如果还要继续往数组中追加元素,那么 PHP 会将现有的 bucket 数量翻倍,所以,使用 array_push 往结果数组中追加元素时,并不是每次操作都需要分配新的 bucket,这样就减少了分配内存的次数,同时加快了程序运行时间,提升了 PHP 性能。

    3. 使用元素追加的方式,原理与 array_push 类似,唯一的区别在于使用 array_push 会有函数调用,而元素追加的方式不需要函数调用,这样程序运行会更轻量。


    起源地下载网 » PHP 中集中合并数组的方法的性能以及内存消耗的比较

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元