Java 为什么字节映射比位映射快?
我读过垃圾收集手册。它说在做卡片表时,他们使用bytemap而不是位图,并且说它比位图快,这是因为高速缓存线吗?但据我所知,缓存线通常是64字节,如果我们对字节进行更改,竞争竞争仍然存在,其他cpu仍会使缓存线无效,这与位图相同,任何人都可以在这方面帮助我?不确定我是否正确理解上下文,但一般来说:Java 为什么字节映射比位映射快?,java,algorithm,garbage-collection,jvm-hotspot,garbage,Java,Algorithm,Garbage Collection,Jvm Hotspot,Garbage,我读过垃圾收集手册。它说在做卡片表时,他们使用bytemap而不是位图,并且说它比位图快,这是因为高速缓存线吗?但据我所知,缓存线通常是64字节,如果我们对字节进行更改,竞争竞争仍然存在,其他cpu仍会使缓存线无效,这与位图相同,任何人都可以在这方面帮助我?不确定我是否正确理解上下文,但一般来说: 位图访问 需要地址操作和整个字节/字/的读写。。。因为大多数体系结构不支持位读/写内存访问 因此,对于8位映射,如: BYTE map[]; 读取它的代码是: readed_bit=(map[bit
BYTE map[];
读取它的代码是:
readed_bit=(map[bit>>3]>>(bit&7))&1;
设置:
设置:
清楚:
map[bit>>3]&=255^(1<<(bit&7));
map[byte]=0;
其中byte
是您要访问的字节。正如您所看到的,如果只将布尔值存储在单个字节中,则会浪费内存空间因此,除非你有专门的HW设计来处理位图和平面,否则字节映射会更快。。。但是每一条规则都有一个例外,所以有些算法已经获得了屏蔽地址和位屏蔽,在这种情况下,位映射更快或与字节映射一样快…我认为屏蔽和移位没有那么重要,大多数CPU可以并行地做这件事。最重要的是,
|=
和&=
意味着读取值、更新值并将其写回,当然,这比仅将1
或0
写入位置要昂贵。特别是在SMP机器上,读-修改-写周期必须是原子周期时。虽然缓存线上的竞争可能仍然存在,但CPU仅在实际发生时才会同步缓存线,而位操作必须是原子操作,因为可能存在竞争…@Holger内存地址取决于位地址操作,因此必须在使用前计算它,这使得它不可并行。但你是对的,双访问(如果不是像逻辑单元网格那样使用的特殊架构)是最慢的速度…有CPU在一个周期内完成所有运算。这类似于“CompressedOOPs”,所有对象引用都必须向左移动才能访问内存。这可以在早期管道阶段完成,不会影响实际操作的性能。嗯,不,除非您有非常特定的硬件,否则位访问速度将快几个数量级,因为您可以更高效地利用缓存7倍。当然,除非你的整个问题都只存在于缓存中。@Holger,这是你第二次回答我的问题,非常感谢,我认为你所说的是正确的,但是有没有我们可以参考的书知道更多的细节。
readed_byte=map[byte];
map[byte]=1;
map[byte]=0;