为什么 Java 中的 BitSet 的内部数据存储为 long[] 而不是 Java 中的 int[]?

2022-09-03 18:00:10

在java中,BitSet的内部数据存储为long[]而不是int[],我想知道为什么?下面是 jdk 中的代码:

 /**
 * The internal field corresponding to the serialField "bits".
 */
 private long[] words;

如果这一切都与性能有关,我想知道为什么长[]存储会得到更好的性能。


答案 1

查询或操作单个位时,没有显著差异。您必须计算单词索引并读取该单词,并且在更新的情况下,操作该单词的一个位并将其写回。对于 和 都是一样的。int[]long[]

有人可能会争辩说,如果你有一个真正的32位内存总线,使用a而不是a可能会增加必须为单个位操作传输的内存量,但是由于Java是在上个世纪九十年代设计的,因此设计人员认为这不再是问题。longint

另一方面,一次处理多个位时,您将获得巨大的胜利。当您对整个执行 andxor操作时,您可以在使用数组时一次对整个字执行操作,读取 64 位。BitSetlong

同样,在搜索下一个设置位时,如果该位不在起始位置的单词内,则首先针对零测试后续单词,这是一个固有操作,即使对于大多数32位CPU也是如此,因此您可以一次跳过64个零位,而第一个非零单词肯定会包含下一个设置位, 因此,整个迭代只需要一个位提取操作。

这些对批量操作的好处将超过任何与单比特相关的缺点(如果有的话)。如前所述,当今的大多数CPU都能够直接对64位字执行所有操作。


答案 2

在 64 位计算机上,对单个值执行按位操作的性能明显高于对两个值执行相同操作的性能,因为硬件直接支持 64 位值。在 32 位计算机上,差异可能不是很大。longint


推荐