В Java два типа данных: raw и производные от Object.
Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.
В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций.
А как поступают в таких случаях в Java?
Здравствуйте, twistedsoul, Вы писали:
T>В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций. T>А как поступают в таких случаях в Java?
В Java в таких случаях не напрягаются, нервные клетки-то не восстанавливаются
Если хочется повыжимать байты, пользуйся С++. Если хочется биты повыжимать — к твоим услугам ассемблер. А если хочется сломать мозги о какой-нибудь ненужный фреймворк — вот тут-то ява и пригодится.
Здравствуйте, twistedsoul, Вы писали:
T>В Java два типа данных: raw и производные от Object. T>Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора. T>Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.
T>В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций. T>А как поступают в таких случаях в Java?
Лично я решал бы такую проблему так:
1) Проверил бы еще раз, нужно ли мне такое большое колличество обектов.
2) Если нужно, то тогда попробовал бы использовать такие вещи как ObjectPool и Lightweight Objects.
3) Попытался бы оттюнить GC.
4) Прочитал бы молитву за здоровье GC.
5) Вытянул бы ноги и расслабился.
> В Java два типа данных: raw и производные от Object. > Все типы, производные от Object, несут в себе накладные расходы: > дополнительная память в 8 байт, динамическая аллокация, сборка мусора. > Если объект макроскопический, то это несущественно. Но что делать, если > надо работать со структурами небольшого размера в больших количествах? > А как поступают в таких случаях в Java? > как оптимизировать мелкие структурки?
Шаблон Приспособленец (Flyweight) — использует разделение для эффективной поддержки большого числа мелких объектов.
Здравствуйте, JavaBean, Вы писали:
JB>Шаблон Приспособленец (Flyweight) — использует разделение для эффективной поддержки большого числа мелких объектов.
К сожалению, не выйдет. Flyweight работает, если число состояний объекта мало по сравнению с количеством самих объектов. А в моем случае это не так. Число состояний не ограничено: могут быть разными хоть все объекты.
Здравствуйте, Nicht, Вы писали:
N>Лично я решал бы такую проблему так: N>1) Проверил бы еще раз, нужно ли мне такое большое колличество обектов. N>2) Если нужно, то тогда попробовал бы использовать такие вещи как ObjectPool и Lightweight Objects. N>3) Попытался бы оттюнить GC. N>4) Прочитал бы молитву за здоровье GC. N>5) Вытянул бы ноги и расслабился.
N>Можно в принципе переставить местами 2 и 3
Угу, нужно.
ObjectPool и Lightweight Objects это тоже самое, что Flyweight pattern или что-то иное?
Здравствуйте, twistedsoul, Вы писали:
T>В Java два типа данных: raw и производные от Object. T>Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
T>А как поступают в таких случаях в Java?
в таких случаях все хранится в массивах.... если в объекте все поля одного типа — можно хранить в одном массиве
если разного то — на каждое поле по ячейке массива конкретного типа.
получается что то типа таблицы — колонка это массив содержащий данные конкретного поля, конкретного типа всех объектов, а строка собственно все поля объекта
проверенно работает. нужно только написать меннеджер который будет обслуживать данную структуру (но это уже домашнее задание ). эффективность хранения не ниже чем в с++
С Уважением Сергей Чикирев
Re: как оптимизировать мелкие структурки?
От:
Аноним
Дата:
25.11.06 16:16
Оценка:
Здравствуйте, twistedsoul, Вы писали:
T>В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций. T>А как поступают в таких случаях в Java?
Здравствуйте, twistedsoul, Вы писали:
T>В Java два типа данных: raw и производные от Object. T>Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора. T>Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.
T>В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций. T>А как поступают в таких случаях в Java?
Здравствуйте, twistedsoul, Вы писали:
T>Здравствуйте, Nicht, Вы писали:
N>>Лично я решал бы такую проблему так: N>>1) Проверил бы еще раз, нужно ли мне такое большое колличество обектов. N>>2) Если нужно, то тогда попробовал бы использовать такие вещи как ObjectPool и Lightweight Objects. N>>3) Попытался бы оттюнить GC. N>>4) Прочитал бы молитву за здоровье GC. N>>5) Вытянул бы ноги и расслабился.
N>>Можно в принципе переставить местами 2 и 3
T>Угу, нужно. T>ObjectPool и Lightweight Objects это тоже самое, что Flyweight pattern или что-то иное?
Lightweight = Flyweight
ObjectPool — это пул для обектов, которых много создается, но одновременно используется не очень много.
Можно в этих объектах реализовать полную смену состояния и тем самым превлащать старый объект в новый.