Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > -De-

Рейтинг: 5.00. Голосов: 4.

Про память, занимаемую Object и Array и что такое Array

Запись от -De- размещена 28.08.2011 в 18:39

В документации сказано, что для ассоциативных массивов (ну т.е. Object, например) используются хэш-таблицы. Но хэш-таблица - занимает память сама по себе и менять её размер бывает не весело. i.o. сказал, дескать вот те исходники тамарина, кури.
Выяснилось, что таки хэш-таблица, динамическая (размер меняется). Когда заполняется, то меняет размер, становится 2 * N + 1 (если старая N). Т.е. размер растёт скачками раза в два:
Код AS3:
import flash.sampler.getSize;
...
var obj:Object = new Object();
   trace(getSize(obj));
   for (i = 0; i < 100; ++i) {
    obj[i] = i;
    trace(getSize(obj));
   }
Array не так прост - у него есть отдельно поле m_denseArr (и вот там внутри что-то вроде Vector.<*>). И если массив плотный, то скорость работы с ним (и память) где-то как с вектором. Что такое плотный массив? Это массив, первый индекс которого 0, индексы которого идут подряд.
Код AS3:
import flash.sampler.getSize;
...
var obj:Array = new Array();
   trace(getSize(obj));
   for (i = 0; i < 100; ++i) {
    obj[i+1] = i;
    trace(i,getSize(obj));
   }
   obj[0] = 0;
   trace(i,getSize(obj));
// последние две строки вывода
//99 1064 - тут массив не плотный
//100 488 - теперь стал плотным
Выводы - плотный массив практически тот же вектор. Не плотных массивов лучше не делать.
Лишний индекс может увеличить пожираемую память вашего обьекта в два раза и вставиться не так быстро, как остальные (хотя обычно это ничего не решает).
Всего комментариев 22

Комментарии

Старый 29.08.2011 01:00 КорДум вне форума
КорДум
 
Аватар для КорДум
Ты все-таки разобрался? Круто.
Вот глупый вопрос по хэшам. Если я не добавляю, а убиваю элемент (delete для динамических свойств как раз), память уменьшается в два раза?
Старый 29.08.2011 01:15 -De- вне форума
-De-
 
Аватар для -De-
Ну проверь, исходники-то тамарина и флэшплеера - не одно и то же (ну мало ли, что в последних плеерах), так что в них таки сомневаться надо, а верить тестам.
Ответ - нет, память не уменьшается, хоть всё убей. И у массива и у Object (у массива может расти, если он становится не плотным при удалении).
Старый 29.08.2011 01:31 КорДум вне форума
КорДум
 
Аватар для КорДум
Не уменьшается. Хм, наверно оставили это дело для GC.
Старый 29.08.2011 03:37 in4core вне форума
in4core
 
Аватар для in4core
Не понимаю честно говоря зачем люди рассматривают все эти случаи в жизни и на практике. Одно дело рассмотр интер_фрейма, таймеров и т.д. Но массивы и объекты - которые даже супер слабый компьютер не нагнут как не пиши, не пофиг ли? Зарядка минимальная настолько что блевать хочется.... о чем вообще канитель о том, что лучше писать так, а не эдак? Ну лучше окей, толку то в данный момент лишь в красивости - производительность сnрадает на 0.01% - прекрасно.
Старый 29.08.2011 10:31 fish_r вне форума
fish_r
 
Аватар для fish_r
thank's. Очень полезно.
Старый 29.08.2011 12:03 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
Не уменьшается. Хм, наверно оставили это дело для GC
Маловероятно, что GC будет пересобирать hashmap. Все ж таки это трудоемкая операция. По крайней мере, если объект используется - то есть вероятность что свойства к нему снова добавят и нет смысла перестраивать таблицу. Если объект не используется - то смысла тоже нет, проще очистить память, выделенную под него.
Старый 29.08.2011 15:11 КорДум вне форума
КорДум
 
Аватар для КорДум
gloomyBrain, с одной стороны это хорошо: GC — штука ресурсоемкая, меньше обязанностей для него будет на руку. Но, черт, к памяти стали относиться как к безграничной области. На мелких флешках этого не видно, но в крупных проектах? Вроде как в FP11 планируют допилить GC, интересно, какие нововведения в него добавят.
Сразу вспоминается цитата с баша.
Старый 29.08.2011 15:41 mooncar вне форума
mooncar
 
Аватар для mooncar
Простите, я правильно понимаю, что эта статья относится к самой организации массива, то есть без разницы - когда в массиве находится BitmapData или просто булевы значения? Или вообще содержимое массива тут не при чем?
Старый 29.08.2011 15:45 -De- вне форума
-De-
 
Аватар для -De-
Да. Всё равно там считай ссылки хранятся всегда, а на что там ссылки - не важно.
Старый 29.08.2011 16:03 mooncar вне форума
mooncar
 
Аватар для mooncar
Ага, спасибо, я так и подумал, но уже когда "разместить" нажал
Старый 29.08.2011 16:06 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
КорДум, mooncar - Array и Object не типизированы, так что они просто содержат наборы указателей (что, кстати, позволяет им занимать мало места в памяти).
Старый 29.08.2011 16:12 КорДум вне форума
КорДум
 
Аватар для КорДум
Логично. Ага.
Старый 29.08.2011 16:41 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
-De-, спасибо за статью.
in4core, понимание подобных проблем приходит с возрастом/опытом. (эта реплика не нуждается в коментариях)
Старый 29.08.2011 16:43 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
in4core, понимание подобных проблем приходит с возрастом/опытом
Угу когда работаешь уже на ФСБ)))
Старый 29.08.2011 16:53 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Угу когда работаешь уже на ФСБ)))
Когда делаешь приложение для телевизора, или для телефона.
Старый 29.08.2011 17:46 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
alatar, честно говоря, все проблемы флеша - это отрисовка. По крайней мере у меня iPad выдает 60 fps при оптимизации отрисовки, без изменения кода логики приложения.
Старый 29.08.2011 18:43 alatar вне форума
alatar
 
Аватар для alatar
Частые вызовы GC не меньшая проблема, а iPAD не единственный девайс воспроизводящий флеш (точнее, официального флешплеера под него как раз и нет). Далеко не на всех устройствах возпроизводящих флеш /аир есть хотя бы 512Мб оперативы.
Старый 29.08.2011 19:06 -De- вне форума
-De-
 
Аватар для -De-
gloomyBrain, по-моему просто на фоне отрисовки других проблем не заметно %)
Например, тесты числодробилки/хэша. Писал новичок в as3, но как я ни старался, его C# обгонял в 10 или больше раз мой as3: http://sotnyk.com/2010/08/07/flex-1-...voditelnost/2/
Старый 29.08.2011 19:49 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Когда делаешь приложение для телевизора, или для телефона.
Честно говоря об этом не подумал ибо в этой сфере не работал ни разу. Все правильно говоришь
Старый 31.08.2011 01:34 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Но массивы и объекты - которые даже супер слабый компьютер не нагнут как не пиши, не пофиг ли?
Вот знаешь, когда пишут нормальные программы не однодневки люди разрабатывают некое ядро, фреймворк для работы. Куча нативных классов — это своеобразный фреймворк для тебя. И на его основе ты делаешь кучу разных приложений, сайтов, игр. Поистине полёт фантазий, всё что пожелаешь. И вот меняя, например, координату "x" у спрайта, ты затрачиваешь некоторое время процессорного времени, как и вообще на любую операцию. И вся соль в том, что ты никак не сделаешь эту операцию быстрее.

И вот когда ты сделаешь ядро, на котором будет разрабатываться приложение - ты поставишь точку в быстродействии. Ты будешь использовать линейные структуры данных, вместо RB-деревьев, делать неплотные массивы, постоянно использовать Array#shift(), вместо Array#pop с "разворотом" массива и всё в этом духе. Потому что ты об этом никогда не задумываешься.
Когда люди о чем-то говорят, нужно сперва подумать. На форуме часто говорят "это копейки". Это копейки когда действительно плевать, 1 наносекунду скрипт бежит или 5. Вот если бы создатели Box2D так думали, черт ас-два физика и на 40 коробках бегала бы шустро. Потому что им была разница.

И мне очень грустно твоё неуважение к труду -De-. Он описал поведение фп на лоу-левеле. Это чертовски интересно. Индексация в массиве не с 0 - и скорости труба. Ты вот знал? Я — нет. И вот от этого тебя "блевать" тянет?
Дело твоё, конечно. Но пора бы уже что-то посерьезней, чем спрайтом одним на сцене заливку класть. Бон вояж.
Старый 01.09.2011 00:09 i.o. вне форума
i.o.
 
Аватар для i.o.
-De-, а говорил смотреть не будешь...
Спасибо за расследование, весьма полезное.

Цитата:
Не понимаю честно говоря зачем люди рассматривают все эти случаи в жизни и на практике. Одно дело рассмотр интер_фрейма, таймеров и т.д. Но массивы и объекты - которые даже супер слабый компьютер не нагнут как не пиши, не пофиг ли? Зарядка минимальная настолько что блевать хочется.... о чем вообще канитель о том, что лучше писать так, а не эдак? Ну лучше окей, толку то в данный момент лишь в красивости - производительность сnрадает на 0.01% - прекрасно.
Раз не понимаешь - значит не для тебя. Иди лесом, здесь не туалет.
Обновил(-а) i.o. 01.09.2011 в 00:11
Старый 03.09.2011 21:53 funnycrap вне форума
funnycrap
странно что не попали на эту статью http://jpauclair.net/2009/12/02/tama...t-i-as3-array/
 

 


Часовой пояс GMT +4, время: 20:51.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.