站長資訊網
        最全最豐富的資訊網站

        PHP數組合并方法:array_merge VS array_push VS 元素追加

        本篇文章給大家分享三種PHP數組合并方法:array_merge、array_push和元素追加法,并比較一下它們的性能和內存消耗。

        PHP數組合并方法:array_merge VS array_push VS 元素追加

        在 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

        ⒊ 原因分析

        • 使用 array_merge ,每調用一次,都需要為 array_merge 的結果數組分配新的內存空間(PHP 采用的是寫時復制的機制,而 array_merge 不會對參數進行寫操作,所以每次調用時并不需要為入參重新分配內存)。隨著數組長度的增加,調用 array_merge 的次數也會增加,重新分配內存的次數也會增加,同時結果數組的長度不斷增加,每次所需要分配的內存空間也會隨著增加,這就需要消耗大量的內存。同時,頻繁的分配/銷毀內存,導致 PHP 的性能下降。

        • 使用 array_push ,只需要對結果數組分配一次內存,之后會一直往結果數組中追加元素。PHP 數組的底層實現方式為 hashtable,并且在初始化時會為 hashtable 分配 8 個長度的 bucket,每個 bucket 存儲一個數組元素。當現有的 bucket 用完之后,如果還要繼續往數組中追加元素,那么 PHP 會將現有的 bucket 數量翻倍,所以,使用 array_push 往結果數組中追加元素時,并不是每次操作都需要分配新的 bucket,這樣就減少了分配內存的次數,同時加快了程序運行時間,提升了 PHP 性能。

        • 使用元素追加的方式,原理與 array_push 類似,唯一的區別在于使用 array_push 會有函數調用,而元素追加的方式不需要函數調用,這樣程序運行會更輕量。

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: www.精品| 亚洲AV无码久久精品蜜桃| 久久精品国产一区二区电影| 国产精品igao视频网| 久久精品一区二区影院| 久久精品国产99国产精品澳门| 久久久国产乱子伦精品作者| 老司机精品影院91| 一本大道久久a久久精品综合| 精品久久久久久亚洲精品 | 久久97精品久久久久久久不卡| 亚洲国产精品无码专区影院| 欧美激情视频精品一区二区 | 国产精品人人爽人人做我的可爱| 亚洲精品乱码久久久久久不卡| 国产日韩精品无码区免费专区国产| 国产午夜精品视频| 69久久精品无码一区二区| 国内精品久久久久影院优| 日韩人妻无码精品久久久不卡 | 91精品国产综合久久婷婷 | 亚洲精品无码永久中文字幕| 老年人精品视频在线| 久久久久九九精品影院| 国产在线精品一区二区三区不卡 | 亚洲精品乱码久久久久久久久久久久| 欧美精品在线免费| 日韩在线精品一二三区| 三级高清精品国产| 伊人久久精品影院| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 四虎影院国产精品| 亚洲AV永久无码精品一区二区| 欧美精品整片300页| 中文成人无码精品久久久不卡| 中日精品无码一本二本三本| 亚洲国产精品一区第二页 | 日韩国产成人精品视频| 老司机性色福利精品视频| 国产精品综合色区在线观看| 国产精品福利在线观看|