2015-10-22 4 views
0

В Java-памяти нет разницы между байтом или int - оба будут представлены как 4 байта.Имеет ли смысл хранить значения байтов в Карте или он будет по-прежнему использовать 4 байта?

Есть ли в хронике карты разница существует, т. Е. Сохраняет ли Хроника карты байтовые значения как 8 бит или все еще использует 32?

Тот же вопрос, если байт является свойством объекта.

ответ

0

В реализациях примитивной карты (fastutil, koloboke, gs, hppc) значения реализованы как отдельный массив byte[], поэтому они фактически принимают только 1 байт. Если byte является полем другого Java-объекта на куче (значение карты), размер объекта округляется до 8-байтовой границы, поэтому одно поле byte может «взять» 8 байтов. Но чаще он «принимает» 0 байтов, потому что поле помещается в уже существующие отверстия выравнивания.

Для карты хроники значение может иметь размер 1 байт. (И даже 0 байтов, вот как ChronicleSet в настоящее время внедрен - ChronicleMap с 0-байтовыми значениями фиктивных данных.) Это справедливо для всех версий хроники (2, 3).


Редактировать - ответить на комментарий.

Если у вас есть структура с постоянным размером e. г. 6 байт поля, самый простой и эффективный способ - использовать данные mechanishm поколения значение:

interface MyValue { 
    byte getA(); void setA(byte a); 
    byte getB(); void setB(byte b); 
    byte getC(); void setC(byte c); 
    byte getD(); void setD(byte d); 
    byte getE(); void setE(byte e); 
    byte getF(); void setF(byte f); 
} 

map = ChronicleMapBuilder.of(Key.class, MyValue.class).entries(1000).create(); 

// Chronicle Map 2 syntax 
MyValue value = DataValueClasses.newDirectReference(MyValue.class); 
try (Closeable handle = map.getUsingLocked(key, value)) { 
    // access the value here 
    System.out.println(value); 
} 

// Chronicle Map 3 syntax 
try (ExternalMapQueryContext<Key, MyValue, ?> q = map.queryContext(key)) { 
    // if not sure the key is present in the map, check q.entry() != null 
    MyValue value = q.entry().value().get(); 
    // access the value here 
    System.out.println(value); 
} 

Это займет ровно 6 байт на значение.

+0

Я предполагаю, что нет байт <-> бит путаница выше. В этом случае Object с 6 полями типа «byte» будет потреблять (в худшем случае) 8 байтов памяти offheap (говоря о ChronicleMap здесь). Верный? –

+0

@ KostyaKulagin см. Ответ edit – leventov

+0

Спасибо, Роман, единственное замешательство, которое у меня есть, это фраза: _indeed, размер объекта округлен до 8-байтовой границы, поэтому однобайтовое поле может «взять» 8 байтов. В этом случае он не был округлен до 8 байтов? –

0

Я думаю, что знаю ответ. По крайней мере, в версии 2.3.8 значение offheap будет 1 байт для байта (работа выполнена в классе SerializationBuilder).