我试图了解 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的理论:
没有找到它的源代码,但据我所知,向数组添加元素的工作原理如下:
任何人都可以对这个过程有更多的了解并深入解释幕后的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
答案 0 :(得分:0)
我相信我的基准测试是不公平的,因为(希望没有常识的人)会遍历一个数组,然后使用 array_merge 来合并一个元素。
我创建了一个新的benchmark,显示了使用 foreach和手动添加并使用 array_merge 将两个大数组合并为一个之间的区别。
<强>结果强>
将两个阵列手动合并,与将它们与 array_merge 合并相比,没有性能优势。