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

2024-03-13

在java中,内部数据BitSet https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html存储为long[]而不是int[],我想知道为什么? jdk中的代码如下:

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

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


当查询或操作单个位时,没有显着差异。您必须计算单词索引并读取该单词,如果有更新,则操作该单词的一位并将其写回。这对于int[] and long[].

有人可能会争辩说,使用long代替int如果您有真正的 32 位内存总线,则可能会增加单个位操作所需传输的内存量,但由于 Java 是在上世纪 90 年代设计的,因此设计者认为这不再是问题。

另一方面,在处理时你会获得巨大的胜利multiple立即位。当您执行类似操作时and http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#and-java.util.BitSet-, or http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#or-java.util.BitSet- or xor http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#xor-java.util.BitSet-整体上BitSet,您可以在使用a时一次对整个字执行操作,读取64位long array.

同样,当搜索下一个设置位 http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#nextSetBit-int-,如果该位不在起始位置的字内,则首先对后续字进行零测试,这是一个固有操作,即使对于大多数 32 位 CPU 也是如此,因此您可以在第一个非零位时立即跳过 64 个零位word 肯定会包含下一组位,因此整个迭代只需要一次提取操作。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么java中BitSet的内部数据存储为long[]而不是int[]? 的相关文章

随机推荐