我想知道今天在处理DOMDocument而不是普通阵列时我失去了多少内存,这令我感到惊讶。测试表明DOM更有效率 测试很简单:初始化很少,从SOAP获取一些数据并将其放入 1.在数组2.在DOM中,所有这些练习用memory_get_usage测量(分别为假和真) 结果如下:
1:start local 362,204 system 524,288 2:init local 362,472 system 524,288 3:soap local 4,099,776 system 4,718,592 3:dom local 4,101,784 system 4,718,592
1:start local 362,204 system 524,288 2:init local 362,468 system 524,288 3:soap local 4,099,776 system 4,718,592 3:array local 6,118,164 system 6,553,600
有谁能告诉我为什么数组的内存要贵得多?
140kb(我用只有属性值的strlen测量的)数据(通常是文本)如何适合4,101,784 - 4,099,776 = 2008字节。 我只是不明白。
答案 0 :(得分:0)
请注意,memory_get_usage
仅告诉您PHP进程从系统内存分配了多少内存。很可能PHP以大块分配系统内存以提高速度:要求操作系统分配小块(例如140千字节)太慢。然后在PHP进程内部分配预先分配的系统内存:它维护自己的可用内存池和自己的已用内存图。当你在PHP中创建一个小的结构时,它只标记其内部内存池的某些部分,但你无法从外部看到这一点。
2008字节可能是内部内存分配器所需的一些开销。
数字4,718,592在两种情况下都是相同的,是0x480000,或者恰好是1152 4kb的内存页面;这不是巧合。
答案 1 :(得分:0)
如果你检查DOMDocument实现,你会发现他们不会将这个孔存储在一个大数组中,而是它们有一个Object Structure,其中数据存储在变量中,其中一些是数组(DOMDocument implementation )。尽管这更节省内存,因为指针的使用速度较慢。
阵列速度要快得多,但它们需要同时拥有一大块内存,所以如果你试图用阵列模拟一个雇佣阵地,你最终会得到一个大矩阵,你必须拥有所有内存,女巫更快但在内存方面更贵。
答案 2 :(得分:0)
将ps --pid $pid --no-headers -orss
的调用添加到输出中会显示实际的进程内存使用情况。似乎memory_get_usage函数显示了一些假设的内存统计信息。
1:start local 366,656 system 524,288 ps 5,352 kb 2:init local 367,168 system 524,288 ps 5,432 kb 3:soap local 5,007,656 system 5,505,024 ps 13,352 kb 3:array local 6,122,788 system 6,553,600 ps 13,492 kb
1:start local 409,628 system 524,288 ps 5,356 kb 2:init local 409,628 system 524,288 ps 5,436 kb 3:soap local 5,011,328 system 5,505,024 ps 13,348 kb 3:dom local 5,011,328 system 5,505,024 ps 13,592 kb