在Java内存中,byte或int之间没有区别 - 两者都表示为4个字节。
Chronicle Map是否存在差异,即Chronicle Map将字节值存储为8位还是仍然使用32?
如果byte是对象属性,则同样的问题。
答案 0 :(得分:0)
我想我知道答案。至少在2.3.8版本中,一个字节的offheap值为1个字节(在SerializationBuilder类中完成的工作)。
答案 1 :(得分:0)
在原始映射实现中(fastutil,koloboke,gs,hppc)byte
值实现为单独的byte[]
数组,因此它们实际上只占用1个字节。如果byte
是另一个堆上Java对象(它是Map值)的字段,实际上,对象大小向上舍入到8字节边界,因此单个byte
字段可以“取“8个字节。但更常见的是,它“占用”0个字节,因为该字段位于已存在的对齐孔中。
对于Chronicle Map,一个值可以自由地为1个字节。 (甚至0字节,这就是当前ChronicleSet
的假设 - ChronicleMap
具有0字节的虚拟值。)对于所有Chronicle Map版本(2,3)都是如此。
编辑 - 回答评论。
如果你有一个不断大小的结构e。 G。 6字节字段,最简单有效的方法 - 使用数据值生成机制:
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个字节。