我已阅读垃圾收集手册。上面说做卡表的时候用的是字节图而不是位图,还说比位图快,是高速缓存行的缘故吗?但据我所知,缓存行通常是 64 字节,如果我们对字节进行更改,竞争竞争仍然存在,其他 cpu 仍然会使该行无效,这与位图相同,任何人都可以帮助我吗?
最佳答案
不确定我的上下文是否正确,但总的来说:
位图访问
需要对整个 BYTE/WORD/... 进行地址操作和读写,因为大多数架构不支持位读/写内存访问。
所以对于 8 位位图,如:
BYTE map[];
阅读代码是:
readed_bit=(map[bit>>3]>>(bit&7))&1;
设置:
map[bit>>3]|=1<<(bit&7);
清除:
map[bit>>3]&=255^(1<<(bit&7));
其中
bit
是您要访问的位。如您所见,需要进行屏蔽和位移。BYTE map 访问
这可以在大多数架构上直接访问
readed_byte=map[byte];
设置:
map[byte]=1;
清除:
map[byte]=0;
其中
byte
是您要访问的 BYTE。如您所见,如果仅将 boolean 值存储在单个 BYTE 中,则会浪费内存空间。
因此,除非你有特定的HW 设计用于位图和平面,否则 BYTE 映射会更快......但是对于每条规则都有一个异常(exception),所以有些算法你已经得到了屏蔽在这种情况下,地址和位掩码位图比字节图更快或一样快...
关于java - 为什么字节图比位图快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49145122/