【问题标题】:Java data storage optimization optionsJava 数据存储优化选项
【发布时间】:2011-11-11 15:25:31
【问题描述】:

我一直在考虑优化我在 Java 中的两种最新数据存储技术,并想知道哪种真的是最节省内存的。下面是对这两个类的描述。为了论证起见,假设它们具有与数据交互的相同方法,这允许用户通过以下方法单独或按范围获取或设置任何位的状态:

  • public boolean getBitState(byte bitIndex)
    • 检测并返回索引bitIndex处的位状态
  • public Clazz setBitState(byte bitIndex, boolean newState)
    • 将索引bitIndex 处的位状态设置为newState 并返回结果对象
  • public int getStateOfBits(byte startIndex, byte endIndex)
    • 检测并返回startIndexendIndex 之间所有位的状态为int
  • public Clazz setStateOfBits(byte startIndex, byte endIndex, int newState)
    • startIndexendIndex 之间所有位的状态设置为newState 中提供的值。
    • 如果newState 的位数少于适合,则通过在左侧添加零来使其适合
    • 如果 newState 的位数多于适合的位数,则会裁剪多余的位数(左侧)

这些是我为使用此接口而创建的类:

整数数组


此类使用int 作为通过位函数存储 32 位数据的方式。

Array32


此类使用 32 个booleans 的数组作为通过标准数组交互存储 32 位数据的方式。

【问题讨论】:

  • 与任何性能问题一样,对其进行测试。创建越来越大的数组并监控每个实现下的 JVM 内存使用情况。

标签: java arrays optimization memory 32-bit


【解决方案1】:

您是否考虑过使用the BitSet class?看起来它可以完成您需要做的所有事情,并且可能在内存方面得到了很好的优化。

考虑到您的两个选择,绝对不是布尔数组。布尔数组需要额外的内存空间来存储与数据类型关联的元数据。另外,大多数 JVM 会为每个布尔值分配 32 位内存。

【讨论】:

  • 实际上Jon Skeet put up a test 表明在 SUN 的 JVM 上,布尔数组被打包为字节数组,而不是 int - 就像单个布尔值一样。
【解决方案2】:

使用int 和位函数!大多数 JVM 会将 boolean 的数组表示为字节数组。 java.util.BitSet 在内部使用一个 long 数组来表示它的位(64 块)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多