Java 为什么字节映射比位映射快?

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

我读过垃圾收集手册。它说在做卡片表时,他们使用bytemap而不是位图,并且说它比位图快,这是因为高速缓存线吗?但据我所知,缓存线通常是64字节,如果我们对字节进行更改,竞争竞争仍然存在,其他cpu仍会使缓存线无效,这与位图相同,任何人都可以在这方面帮助我?

不确定我是否正确理解上下文,但一般来说:

  • 位图访问

    需要地址操作和整个字节/字/的读写。。。因为大多数体系结构不支持位读/写内存访问

    因此,对于8位映射,如:

    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;