我想了解PHP中
array_merge
和union
的内部工作原理,以满足我的好奇心。请帮我了解以下ZEND内部实现:
array_merge
(CPU和RAM较慢)UNION
(在所有方面都更快)
➜ 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 union 20000
使用union构建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
$list[] = [$i => [$i]]
应该改为$list[$i] = [$i]
或者$list[] = [$i]
? - NikiC