Параметры оптимизации хранения данных Java - PullRequest
3 голосов
/ 07 сентября 2011

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

  • public boolean getBitState(byte bitIndex)
    • Обнаруживает и возвращает состояние бита с индексом bitIndex
  • public Clazz setBitState(byte bitIndex, boolean newState)
    • Устанавливает состояние битапо индексу bitIndex до newState и возвращает результирующий объект
  • public int getStateOfBits(byte startIndex, byte endIndex)
    • Обнаруживает и возвращает состояние всех битов между startIndex и endIndex как int
  • public Clazz setStateOfBits(byte startIndex, byte endIndex, int newState)
    • Устанавливает состояние всех битов между startIndex и endIndex равным значению, указанному в newState.
    • Если у newState меньше битов, чем умещается, это делается для подгонки путем добавления нулей слева
    • Если newState имеет больше битов, чем умещается, избыточные биты (слевасторона) обрезаны

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

IntArray


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

Array32


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

Ответы [ 2 ]

6 голосов
/ 07 сентября 2011

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

5 голосов
/ 07 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...