PHP

时间:2018-01-22 10:51:07

标签: php performance memory cpu internals

我试图了解 array_merge union 如何出于好奇而在PHP幕后工作。

有人可以帮我理解幕后的ZEND内幕:

  • array_merge (CPU和RAM较慢)
  • UNION (各个方面都更快)

以下是我正在运行的基准代码:https://gist.github.com/EnchanterIO/6e90f828c1b32c894d35267c353e83d2

使用PHP 7的输出是:

  

➜ArrayMergegit :(主)✗phpsrc / benchmark.php array_merge 20000

     

使用array_merge构建20000个元素的数组需要7秒。

     

内存使用量为:8 MB。内存峰值为:12288 MB。

     

➜ArrayMergegit :( master)✗phpsrc / benchmark.tp union 20000

     

使用union构建20000个元素的数组需要0秒。

     

内存使用量为:8 MB。内存峰值为:10240 MB。

我对array_merge的理论:

我正在看PHP source code written in C for array merge(如果这是正确的地方),即使它对我来说有点难以理解,因为我不熟悉行话,这似乎是{{1较慢的原因是需要额外的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

1 个答案:

答案 0 :(得分:0)

我相信我的基准测试是不公平的,因为(希望没有常识的人)会遍历一个数组,然后使用 array_merge 来合并一个元素。

我创建了一个新的benchmark,显示了使用 foreach和手动添加并使用 array_merge 将两个大数组合并为一个之间的区别。

enter image description here

<强>结果

将两个阵列手动合并,与将它们与 array_merge 合并相比,没有性能优势。