为什么与DOMDocument相比,创建一个数组会消耗更多的内存


Why creating an array consumes a way more memory compare with DOMDocument?

我想知道今天我在处理DOMDocument而不是普通数组时损失了多少内存,这让我感到惊讶。测试表明DOM效率更高。
测试很简单:简单的初始化,从SOAP获取一些数据并将其放入
1. 在数组2中。和使用memory_get_usage(分别为false和true)测量的所有练习
结果如下:

    数组
1:启动本地362,204系统524,2882:init local 362472 system 5242883:soap local 4,099,776 system 4,718,5923:dom local 4,101,784 system 4,718,592
    DOM
1:启动本地362,204系统524,2882:init local 362468 system 5242883:soap local 4,099,776 system 4,718,5923:array local 6,118,164 system 6,553,600

谁能告诉我为什么数组更昂贵的内存?

140kb的数据(通常是文本)如何适合4,101,784 - 4,099,776 = 2008字节?我就是不明白。

注意,memory_get_usage只告诉您PHP进程从系统内存中分配了多少内存。最有可能的是,PHP将系统内存分配为大块以提高速度:要求操作系统分配小块(例如140 kb)太慢了。然后在PHP进程内部分配预分配的系统内存:它维护自己的空闲内存池和自己的已用内存图。当您在PHP中创建一个较小的结构时,它只是将其内部内存池的某些部分标记为已使用,但是您无法从外部看到这一点。

2008字节可能是内部内存分配器需要的一些开销。

数字4,718,592在这两种情况下是相同的,是0x480000,或者恰好是1152 4kb内存页;这不是巧合。

如果你检查DOMDocument的实现,你会看到他们不存储洞的东西在一个大数组,而是他们有一个对象结构,其中数据存储在变量和其中一些是数组(DOMDocument实现)。虽然这是更有效的内存,因为使用指针,它的速度较慢。

数组要快得多,但它们一次需要一大块内存,所以如果你试图用数组来建模层次结构,你最终会得到一个大矩阵,你必须把所有矩阵都放在内存中,这样更快,但在内存方面更昂贵。

ps --pid $pid --no-headers -orss的调用添加到输出中显示了实际的进程内存使用情况。似乎memory_get_usage函数显示了一些假设的内存统计信息。

1:启动本地366,656系统524,288 ps 5,352 KB2:init local 367,168 system 524,288 ps 5,432 KB3:soap local 5,007,656 system 5,505,024 ps 13,352 KB3:array local 6,122,788 system 6,553,600 ps 13,492 kb
1:启动本地409,628系统524,288 ps 5,356 KB2:init local 409,628 system 524,288 ps 5,436 KB3:soap local 5,011,328 system 5,505,024 ps 13,348 KB3:dom local 5,011,328 system 5,505,024 ps 13,592 KB