Re: как оптимизировать мелкие структурки?
От: JavaBean Украина  
Дата: 24.11.06 13:07
Оценка: +2
> В Java два типа данных: raw и производные от Object.
> Все типы, производные от Object, несут в себе накладные расходы:
> дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
> Если объект макроскопический, то это несущественно. Но что делать, если
> надо работать со структурами небольшого размера в больших количествах?
> А как поступают в таких случаях в Java?
> как оптимизировать мелкие структурки?

Шаблон Приспособленец (Flyweight) — использует разделение для эффективной поддержки большого числа мелких объектов.
Posted via RSDN NNTP Server 2.0
Re: как оптимизировать мелкие структурки?
От: Nicht Россия  
Дата: 24.11.06 13:06
Оценка: +1
Здравствуйте, 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) Вытянул бы ноги и расслабился.

Можно в принципе переставить местами 2 и 3
Re: как оптимизировать мелкие структурки?
От: vladserge Россия  
Дата: 25.11.06 10:19
Оценка: +1
Здравствуйте, twistedsoul, Вы писали:

T>В Java два типа данных: raw и производные от Object.

T>Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.

T>А как поступают в таких случаях в Java?


в таких случаях все хранится в массивах.... если в объекте все поля одного типа — можно хранить в одном массиве

если разного то — на каждое поле по ячейке массива конкретного типа.
получается что то типа таблицы — колонка это массив содержащий данные конкретного поля, конкретного типа всех объектов, а строка собственно все поля объекта

проверенно работает. нужно только написать меннеджер который будет обслуживать данную структуру (но это уже домашнее задание ). эффективность хранения не ниже чем в с++
С Уважением Сергей Чикирев
как оптимизировать мелкие структурки?
От: twistedsoul  
Дата: 24.11.06 12:37
Оценка:
В Java два типа данных: raw и производные от Object.
Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.

В C++ все это решается тем, что там можно хранить сложные типы по значению, можно заводить тела сложных локальных переменных на стеке, избегая лишних промежуточных аллокаций.
А как поступают в таких случаях в Java?
Re: как оптимизировать мелкие структурки?
От: Cider Россия  
Дата: 24.11.06 13:05
Оценка:
Здравствуйте, twistedsoul, Вы писали:

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

T>А как поступают в таких случаях в Java?

В Java в таких случаях не напрягаются, нервные клетки-то не восстанавливаются
Если хочется повыжимать байты, пользуйся С++. Если хочется биты повыжимать — к твоим услугам ассемблер. А если хочется сломать мозги о какой-нибудь ненужный фреймворк — вот тут-то ява и пригодится.
Cider
Re[2]: как оптимизировать мелкие структурки?
От: twistedsoul  
Дата: 25.11.06 08:14
Оценка:
Здравствуйте, JavaBean, Вы писали:

JB>Шаблон Приспособленец (Flyweight) — использует разделение для эффективной поддержки большого числа мелких объектов.


К сожалению, не выйдет. Flyweight работает, если число состояний объекта мало по сравнению с количеством самих объектов. А в моем случае это не так. Число состояний не ограничено: могут быть разными хоть все объекты.
Re[2]: как оптимизировать мелкие структурки?
От: twistedsoul  
Дата: 25.11.06 08:37
Оценка:
Здравствуйте, 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 или что-то иное?
Re: как оптимизировать мелкие структурки?
От: Аноним  
Дата: 25.11.06 16:16
Оценка:
Здравствуйте, twistedsoul, Вы писали:

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

T>А как поступают в таких случаях в Java?

http://www.java2s.com/Code/Java/Design-Pattern/FlyweightPatterninJava.htm

http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-designpatterns.html
Re: как оптимизировать мелкие структурки?
От: aka50 Россия  
Дата: 28.11.06 08:56
Оценка:
Здравствуйте, twistedsoul, Вы писали:

T>В Java два типа данных: raw и производные от Object.

T>Все типы, производные от Object, несут в себе накладные расходы: дополнительная память в 8 байт, динамическая аллокация, сборка мусора.
T>Если объект макроскопический, то это несущественно. Но что делать, если надо работать со структурами небольшого размера в больших количествах? Типичный пример: Vec3, в котором три float x, y, z. Накладные расходы за класс размер потребляемой памяти увеличивают почти в два раза.

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

T>А как поступают в таких случаях в Java?

еще пишут багрепорты в sun.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4820062

т.е. если очень нужно, то можно поступить примерно так:

You can accomplish something similar in Java:

static int SIZEOF_FOO = 2;
static int SIZEOF_INT = 1;
int getFoo_b(IntBuffer foos, int index) {
    return foos.get(index*SIZEOF_FOO+SIZEOF_INT);
}



The expression similar to foos[6].b would be:


getFoo_b(foos, 6)


еще есть вариант использовать Javolution (http://javolution.org/)

Но как сказали выше, сначала стоит понять, а оно вообще надо?
Re[3]: как оптимизировать мелкие структурки?
От: Nicht Россия  
Дата: 28.11.06 09:42
Оценка:
Здравствуйте, 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 — это пул для обектов, которых много создается, но одновременно используется не очень много.
Можно в этих объектах реализовать полную смену состояния и тем самым превлащать старый объект в новый.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.