java - 为什么字节图比位图快?

标签 java algorithm garbage-collection jvm-hotspot garbage

我已阅读垃圾收集手册。上面说做卡表的时候用的是字节图而不是位图,还说比位图快,是高速缓存行的缘故吗?但据我所知,缓存行通常是 64 字节,如果我们对字节进行更改,竞争竞争仍然存在,其他 cpu 仍然会使该行无效,这与位图相同,任何人都可以帮助我吗?

最佳答案

不确定我的上下文是否正确,但总的来说:

  1. 位图访问

    需要对整个 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 是您要访问的位。如您所见,需要进行屏蔽和位移。

  2. 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/

相关文章:

java - 如何使用 PowerMock 测试从同一类调用另一个私有(private) void 方法的方法?

java - 通过 Swing 数据库进行实时搜索(或自动完成)

algorithm - 在具有内存约束的 2 个单链表中有效地搜索公共(public)节点?

音乐模仿算法?

android垃圾收集器,释放对象内部的对象

java - 闲置仪表

java - 模拟时长按而不是简单

algorithm - 使用堆排序对 0 和 1 数组进行排序的时间复杂度是多少?

c# - 在 C# 中的运行时向类型化对象添加 expando 属性

go - gc 会在 Golang 中将数组设置为 nil 时收集对象吗?