为什么创建一个数组会占用与DOMDocument相比更多的内存?

时间:2011-04-20 13:40:36

标签: php xml dom

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

  1. 阵列
  2. 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. DOM
    2. 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字节。 我只是不明白。

3 个答案:

答案 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