簡體   English   中英

array_merge vs聯合在PHP中的性能

[英]Performance of array_merge vs union in PHP

我試圖出於好奇而了解array_mergeunion在PHP幕后的工作方式。

有人可以幫助我了解以下幕后的ZEND內部原理嗎:

  • array_merge (在CPU和RAM上速度較慢)
  • UNION (各個方面都更快)

這是我正在運行的基准代碼: https : //gist.github.com/EnchanterIO/6e90f828c1b32c894d35267c353e83d2

使用PHP 7的輸出為:

➜ArrayMerge git:(master)✗php src / benchmark.php array_merge 20000

使用array_merge構建20000個元素的數組需要7秒鍾。

內存使用量為:8 MB。 內存峰值為:12288 MB。

➜ArrayMerge git:(master)✗php src / benchmark.php聯合20000

使用聯合構建20000個元素的數組花費了0秒。

內存使用量為:8 MB。 內存峰值為:10240 MB。

我的array_merge理論:

我正在查看用C語言編寫的用於數組合並PHP源代碼 (即使這是正確的地方),盡管我不太熟悉該行話,但對我來說有點不可讀,這似乎是array_merge是速度較慢的原因是需要額外的foreach,也由於array_merge對結果數組中的數字鍵重新編號的事實。

我對UNION的理論是:

找不到它的源代碼,但據我所知,向數組添加元素的方式如下:

  • 在開始時,數組內部會分配一定數量的內存
  • 通過向數組添加新元素,最終該數組需要在后台動態分配更多的內存,因此PHP內部(C)創建一個內存量加倍的新數組並復制內容
  • 通過添加更多元素,此過程重復進行
  • 沒有重新排序,沒有foreach,只是隨着時間的推移增加了內存

誰能進一步闡明這個過程,並深入解釋ZEND魔術的幕后故事?

更新:

我被引薦到以下鏈接,但仍然無法解決:

https://lxr.room11.org/xref/php-src%40master/Zend/zend_opcode.c#740 https://lxr.room11.org/xref/php-src%40master/Zend/zend_operators.c#897 https://lxr.room11.org/xref/php-src%40master/Zend/zend_hash.c#1915

我認為我的基准測試是不公平的,因為(希望沒有常識的人)會遍歷一個數組,然后使用array_merge合並一個元素。

我創建了一個新的基准 ,該基准顯示了使用foreach和手動添加以及使用array_merge將兩個大數組合並為一個大數組之間的區別。

在此處輸入圖片說明

結果

與將它們與array_merge合並相比, 手動合並兩個陣列沒有性能優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM