繁体   English   中英

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

[英]Why is the internal data of BitSet in java stored as long[] instead of int[] in Java?

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

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

如果这完全取决于性能,我想知道为什么long []存储会获得更好的性能。

在64位计算机上,对单个long值执行逐位运算比在两个int值上执行相同操作要高得多,因为硬件直接支持64位值。 在32位机器上,差异可能不是很大。

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

有人可能会说,如果你有一个真正的32位内存总线,那么使用long而不是int来实现它可能会增加单个位操作必须传输的内存量,但是因为Java是在上世纪九十年代设计的,设计师们认为这不再是一个问题了。

另一方面,一次处理多个位时,您将获得巨大的成功。 在整个BitSet上执行andorxor等操作时,可以在使用long数组时对整个字执行操作,一次读取64位。

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

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

基于粗略阅读的来源在这里 似乎,主要原因纯粹是为了表现。 这是从源检索到的注释。

BitSets被打包成“单词”数组。 目前,一个字是长的,由64位组成,需要6个地址位。 字大小的选择完全取决于性能问题。

肯定是一个优化问题:单个long值存储最多64位,而int仅存储32个。因此,64以下的任何用户长度只需要数组中的一个条目 如果它是一个int数组,则需要两个条目 ,这些条目的维护速度较慢且较重。

我可能错了,但使用long [] bitSet的基数比使用int []时要大得多。 因为两个数组的最大大小非常相似(但仅限于堆大小)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM