Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылки на комплексные структуры: память/время 
:(
    Опции темы
JollyRoger0
  Дата 8.3.2016, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Доброго времени суток!

Предположим, есть у нас структуры 
Код

ArrayList<Pair<String, ArrayList<Pair<ArrayList<Pair<UnlockCondition, Upgrade>>, ArrayList<Pair<UnlockCondition, Upgrade>>>>>>  а = new ArrayList<>();
ArrayList<String>  b = new ArrayList<>();

делаем:
Код

ArrayList<Pair<String, ArrayList<Pair<ArrayList<Pair<UnlockCondition, Upgrade>>, ArrayList<Pair<UnlockCondition, Upgrade>>>>>> aSameLink = a;
ArrayList<String>  bSameLink = b;

Вопрос: сколько памяти израсходуется на aSameLink и bSameLink? Если одинаково - то понятно, ссылка и есть ссылка. А если нет - то в чём причина, и насколько отличается/сколько в каждом случае занимает памяти? Ведь мы не создаём новых аррайлистов при таком присваивании.
Это на счёт памяти(если время в примере с a,b затрачивается разное, тоже любопытно почему).

Теперь про время: есть структура
Код

ArrayList<Pair<String, Pair<String, Double>>> c = new ArrayList<>();

делаем:
Код

String c1String = c.get(1).getValue().getKey();
Double c1Double = c.get(1).getValue().getValue();

ЛИБО делаем:
Код

Pair c2Pair = c.get(2).getValue();
String c2String = c2Pair.getKey();
Double c2Double = c2Pair.getValue();

То есть, разница в том, что в (1) мы достаём элемент массива, потом достаём value, а потом уже то что надо, и так 2 раза,а в (2) мы достаём сначала один раз элемент и value, а потом то что надо. Вопрос: ускорит ли (2) работу программы, и насколько? Прекрасно осведомлён что на малом кол-ве итераций разница мизер, это неважно, их может стать много:)

Реально вопросы возникли потому, что в программе нужно было использовать монструозную структуру (а), и я хз, сделать ли обьект-подструктуру из двух ArrayList<Pair<UnlockCondition, Upgrade>>, оставляя лишь ArrayList<Pair<String, SUBSTRUCTURE>> в обёртке, либо непосредственно со структурой (а). В первом случае планирую сделать что-то типа getFirstUnlockCondition и getFirstUpgrade методы, которые и будут делать x.get(y).getKey / getValue постоянно.

Как вообще правильно делать структуры, для которых стандартные структуры вроде бы и подходят, но много уровней вложенности? Если таки свой класс - буду рад примерам.
PM MAIL   Вверх
LSD
Дата 9.3.2016, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Генерики существуют только во время компиляции, в рантайме их нет. Поэтому для упрощения можно всю эту кашу из навернутых типов убрать и получится:
Код

ArrayList  а = new ArrayList();
ArrayList  b = new ArrayList();

ArrayList aSameLink = a;
ArrayList bSameLink = b;

и ответ становится очевидным. aSameLink и bSameLink занимают 8-16 байт на стеке.

Что касается второй части вопроса. Тут надо считать сколько занимает одна структура в случае А и сколько их будет всего и сколько занимает структура Б и сколько их будет. Но в принципе N полей распределенные по 2-м объектам будут занимать больше, чем те же N полей лежащих в одном объекте.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JollyRoger0
Дата 10.3.2016, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.1.2016

Репутация: нет
Всего: нет



Цитата

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

Так и подозревал:)

А во второй части меня не интересует память, понятно что чуть больше памяти так будет занято, но с2pair это одна переменная в итерации, так что память абсолютно не важна тут.
PM MAIL   Вверх
LSD
Дата 10.3.2016, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



В этом конкретном примере скорее всего разница будет в пределах статистической погрешности. Плюс JIT вполне может тут провести оптимизацию. В общем это преждевременная оптимизация.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.