Почему создание массива требует гораздо больше памяти по сравнению с DOMDocument? - PullRequest
0 голосов
/ 20 апреля 2011

Мне было интересно, сколько памяти я теряю при обработке DOMDocument вместо обычного массива, и это меня удивило.Тесты показывают, что DOM более эффективен.
Тест был прост: небольшая инициализация, получение некоторых данных из SOAP и помещение их
1. в массив 2. в DOM, и все эти упражнения измерялись с помощью memory_get_usage (false и true соответственно)
Результаты приведены ниже:

  1. Массив
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. ДОМ
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

Может кто-нибудь сказать мнепочему массивы намного дороже памяти?

Каким образом 140 Кбайт (я измерил его с использованием только значений атрибутов) данных (обычно текстовых) умещается в 4 101 784 - 4 099 776 = 2008 байт.Я просто не понимаю.

Ответы [ 3 ]

0 голосов
/ 20 апреля 2011

Если вы проверите реализацию DOMDocument, вы увидите, что они не хранят дырку в одном большом массиве, а имеют объектную структуру, в которой данные хранятся в переменных, а некоторые из них являются массивами ( реализация DOMDocument ). Хотя это более эффективно для памяти, потому что использование указателей, это медленнее.

Массивы намного быстрее, но им требовался один большой кусок памяти одновременно, поэтому, если вы попытаетесь смоделировать наемную матрицу с массивами, у вас получится большая матрица, которую вы должны иметь в памяти, ведь она быстрее но дороже с точки зрения памяти.

0 голосов
/ 26 апреля 2011

Добавление вызова 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
0 голосов
/ 20 апреля 2011

Обратите внимание, что memory_get_usage только сообщает вам, сколько памяти процесс PHP выделил из системной памяти. Скорее всего, PHP выделяет системную память большими блоками для повышения скорости: запрос ОС на выделение небольших кусков (например, 140 кбайт) слишком медленный. Затем предварительно выделенная системная память выделяется внутри процесса PHP: он поддерживает свой собственный пул свободной памяти и свой собственный график используемой памяти. Когда вы создаете небольшую структуру внутри PHP, она просто отмечает некоторую часть своего внутреннего пула памяти как использованную, но вы не можете увидеть это снаружи.

Байты 2008 года, вероятно, являются некоторыми дополнительными затратами, необходимыми для распределителя внутренней памяти.

Число 4 718 592 идентично в обоих случаях и составляет 0x480000, или ровно 1152 страницы памяти 4 КБ; это не совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...