Варианты оптимизации хранения данных Java

Я рассматривал возможность оптимизации двух моих последних методов хранения данных в Java и хотел бы знать, какой из них действительно наиболее эффективен с точки зрения использования памяти. Ниже приведены описания двух классов. В качестве аргумента предположим, что у них есть одни и те же методы взаимодействия с данными, которые позволяют пользователю получать или устанавливать состояние любого из битов по отдельности или по диапазону с помощью следующих методов:

  • public boolean getBitState(byte bitIndex)
    • Detects and returns the state of the bit at index bitIndex
  • public Clazz setBitState(byte bitIndex, boolean newState)
    • Sets the state of the bit at index bitIndex to newState and returns the resulting object
  • public int getStateOfBits(byte startIndex, byte endIndex)
    • Detects and returns the state of all bits between startIndex and endIndex as an int
  • public Clazz setStateOfBits(byte startIndex, byte endIndex, int newState)
    • Sets the state of all bits between startIndex and endIndex to the value provided in newState.
    • Если newState имеет меньше битов, чем подходит, он делается для соответствия, добавляя нули слева
    • Если newState имеет больше битов, чем помещается, лишние биты (с левой стороны) обрезаются

Это классы, которые я сделал для использования этого интерфейса:

IntArray


Этот класс использует int как способ хранения 32-битных данных с помощью побитовых функций.

Массив32


Этот класс использует массив из 32 booleans как способ хранения 32 битов данных посредством стандартных взаимодействий с массивами.


person Ky Leggiero    schedule 06.09.2011    source источник
comment
Как и в случае с любым вопросом производительности, протестируйте его. Создавайте все большие и большие массивы и отслеживайте использование памяти JVM в каждой реализации.   -  person Spike Gronim    schedule 07.09.2011


Ответы (2)


Используйте int и побитовые функции! Большинство JVM будут представлять массив boolean как массив байтов. java.util.BitSet использует внутренне массив длинных чисел для представления своих битов (фрагменты по 64).

person Vlad    schedule 06.09.2011

Рассматривали ли вы возможность использования класса BitSet? Кажется, что он делает все, что вам нужно, и, вероятно, хорошо оптимизирован с точки зрения памяти.

Учитывая ваши два варианта, определенно не массив логических значений. И массив логических значений требует дополнительного места в памяти для метаданных, связанных с типом данных. Кроме того, большинство JVM выделяют 32 бита памяти для каждого логического значения.

person Vivien Barousse    schedule 06.09.2011
comment
На самом деле Джон Скит провел тест показывает, что в JVM SUN массив логических значений упакован как массив байтов, а не как int, как отдельные логические значения. - person Vlad; 07.09.2011