ОЗУ и XML
Запись от toFL размещена 03.04.2014 в 15:45
Привет, постараюсь кратко.
О чем:
Проблема заключается в чрезмерном потреблении памяти при работе с XML структурами.
Особенности класса:
- Объект XML не содержит в себе строк. Он занимает в памяти 24 byte, не зависимо от его длины.
- При обращении к его методам поиска, временно выделяется память на хранение новых структур (Например XMLList и др.)
Пример поиска детей:
Забиваем XML
var myxml:XML = new XML(<root/>); var node:XML = <node a="1" b="2" c="3"/>; var i:int = 0; while (i++ < 100) myxml.appendChild(node); trace(getSize(myxml));//24 byte
Memory Allocations:
- XMLList (< 1Kb)
Пример поиска атрибутов:
Получаем список детей:
Тестируем attribute:
Memory Allocations:
- XMLList (7 Kb)
- QName (3 Kb)
- Namespace (2 Kb)
Тестируем @:
Memory Allocations:
- XMLList (7 Kb)
Личный опыт:
Например в Starling при парсинге xml-лей для TextureAtlas и BitmapFont (и других) в одном кадре может выделится дополнительных до 15Mb. После этой новости я конечно переписал эти функции (Привет Daniel-ю). Когда дело доходит до не самых новых устройств эти несколько лишних метров могут привести к падению. На iPhone4 например приложению доступно всего 100Mb (Видео память - это просто кусок оперативки), по-этому каждый метр на счету

Выводы:
- Минимизировать поиск детей в циклах
- Вместо node.attribute("a") использовать node.@a
- По возможности заменить xml на json
P.S.
Кстати ещё один плюс таких оптимизаций - это производительность, т.к. копирование памяти тоже тяжелая операция. Если кому-нибудь интересно, могу написать статью о работе с ОЗУ на разных желесках и сравнительные тесты с C++ и Objective-C, ассемблерные вставки вместо memcpy и другое.
Всего комментариев 14
Комментарии
![]() ![]() |
|
Спасибо большое!!!
|
![]() ![]() |
|
Жду следующую статью!
|
![]() ![]() |
|
Я переписал starling на XMLDocument и дышать стало легче. Когда-нибудь я сделаю атлас на amf. Но не завтра.
|
![]() ![]() |
|
dimarik - когда нибудь мир станет добрее...
|
![]() ![]() |
|
Ничего личного, бро. Just for fun.
|
![]() ![]() |
|
> Когда-нибудь я сделаю атлас на amf
Я так и сделал. атлас/атласы вместе с описанием лежат в amf https://bitbucket.org/k0t0vich/arp/s....as?at=default доставание ресурсов немного кривоватое, но что есть. https://bitbucket.org/k0t0vich/arp/s....as?at=default |
![]() ![]() |
|
Цитата:
// почему то не сериализуется вектор байтареев
|
![]() ![]() |
|
Цитата:
Rasterizer.as
|
![]() ![]() |
|
Цитата:
Нормально сериализуется, только Region тоже описан как
|
![]() ![]() |
|
Цитата:
Напиши мне в личку
|
![]() ![]() |
|
Кстати Daniel в Starling таки сделал недавно commit с моими правками по работе с атрибутами XML, работа проделана не зря
![]() |
Последние записи от toFL
- ОЗУ и XML (03.04.2014)
- Отличия матриц Marmalade SDK (C++) от матриц AS3 (29.11.2012)