memory - Scala 中的 BitSet 内存使用情况

标签 memory scala performance bitset bitsets

我想知道 Scala 中 BitSet 的内存使用情况是什么。例如,如果我这样做:

  var bitArray:BitSet=new BitSet(10)
  bitArray.add(0)
  bitArray.add(2)
  bitArray.add(4)
  bitArray.add(6)
  bitArray.add(8)

这与包含偶数 0、2、4、6、8 的数组相比如何?

用二进制写一个数字怎么样:
  var bitArray:BitSet=new BitSet(32)
  bitArray.add(5)
  bitArray.add(3)
  bitArray.add(2)
  bitArray.add(1)
  bitArray.add(0)

这与数字 47 相比如何?

我在这里询问内存使用情况。但作为一个更开放的问题,如果您知道,BitSet 的优点/缺点或用途是什么(WR 到其他常见数据类型)。

谢谢,

最佳答案

你可以在这里查看 Scala 2.8 中 BitSet 的实现:scala.collection.mutable.BitSet .

它是基于 Long 数组实现的。数组的大小仅取决于存储在其中的最高数字。将存储在其中的最高数字除以 64,四舍五入,您就得到了数组的大小。数组中的每个元素占用 8 个字节。

这意味着将其中存储的最大数字除以 8,大致得出 BitSet 的字节大小。 “大致”是因为虚拟机内存管理开销,因为指向数组的指针也需要一些内存,并且因为数组本身有一些开销。

插入的顺序或存储在 BitSet 中的实际元素数量对分配的内存大小没有影响。

对于您给出的两个示例,仅需要一个 Long-element 来存储数字,使用 8 字节的内存,因为在两个示例中,最高数字都小于 64。

存储任意五个数字的 Int 数组将消耗 5 * 4 字节 = 20 字节加上开销。要存储 n 个数字,您大约需要 n * 4 个字节。

因此,您将 (highestNumberStored/8) 字节与 (countOfNumbersStored * 4) 字节进行比较。

关于memory - Scala 中的 BitSet 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3140806/

相关文章:

Android Eclipse DDMS > Heap > 导致GC变灰

android - 如何查看android的LruCache中的可用内存?

c++ - 嵌套的 STL vector 使用太多内存

scala - Scala 3 带有参数的枚举导致序列化错误

wpf - Command 中连续 CanExecute 调用的性能损失

C#9、.NET 5.0 字段比发布中的属性更快

performance - 模式下的 unwrap()s 是否被优化掉了?

c - 什么是连续内存块?

scala - 这有组合器吗?

scala - 如何在不执行脚本和生成任何类文件的情况下检查 Scala 脚本的语法?