Задать вопрос

Структуры в JAVA — что я делаю не так?

Всем известно, что Java не поддерживает структуры и поддерживать не будет. Чтобы не было недоразумений, что я понимаю под структурами: по сути, это легковесный класс, у которого есть только поля, которые лежат в определённом порядке и структура имеет размер, равный сумме размеров полей. То есть, например такая структура:
struct MyStruct {
int field1;
int field2;
long field3;
byte field4;
}
В памяти занимает 17 байт, не больше, не меньше + ссылка на неё. В Java классы занимают больше, это известно.

В общем, суть в том, что мне очень нужно хранить данные порциями по 11 байт. При этом хранить их в хэшмапе. То есть варианта в Java получается два — хранить в хэшмапе массив из 11 байт или объект с нужными полями. Массив удобнее.

Но мне пришла в голову мысль выделять 11 байт памяти через sun.misc.Unsafe и хранить в хэшмапе ссылку на область памяти. Используя библиотеку trove ссылка «весит» всего 8 байт, т.к. trove хранит примитивные типы. Объект бы «весил» ещё 16 байт на заголовок + был бы выровнен.

По всем замерам у меня получается, что хэшмапа из миллиона элементов при использовании такой странной схемы заполняется в 2 раза быстрее чем 11-байтовыми массивами, чтение и запись происходит так же быстрее, но не на много. Очевидно, тесты я делать не умею и чего-то не знаю, потому что наверное так работать не должно…

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

Да, я знаю, что так делать нельзя, на Яве пишут не так и всё такое. Писать на java я как раз-таки умею, но иногда нужно выйти за пределы нормального использования…
  • Вопрос задан
  • 10851 просмотр
Подписаться 12 Оценить 1 комментарий
Решения вопроса 1
leventov
@leventov
Очень рекомендую посмотреть запись встречи JUG.ru c Романом Елизаровым — Миллионы котировок в секунду на чистой Java. Основная тема лекции — как раз «структуры» в Java. Там есть ответы на все вопросы, которые вы озвучили в этом треде, и много больше.

По теме: сама аллокация — это точно не то, что следует «оптимизировать» под нынешним Хотспотом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@gribozavr
Если хотите заниматься фигурным выпиливанием по байтам:

1. Подумайте, может оно того не стоит?

2. docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html Но учтите что невыровненные чтения/записи на не-x86 бывают дорогие.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы