在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(使用前将#替换为@)