От некоторых сравнительных тестов с Sun JDK 1.6 вычислительные начала с решетом (лучший из 10 повторений для нагреваний дайте JIT-компилятору шанс и исключите случайные задержки планирования, Core 2 Duo T5600 1.83 ГГц):
BitSet является большей памятью, эффективной, чем булевская переменная [] за исключением очень небольших размеров. Каждая булевская переменная в массиве берет байт. Числа от runtime.freeMemory () немного запутаны для BitSet, но меньше.
булевская переменная [] является большим количеством ЦП, эффективного за исключением очень больших размеров, где они о даже. Например, для размера 1 миллион булевских переменных [] приблизительно в четыре раза быстрее (например, 6 мс по сравнению с 27 мс), для десять и сто миллионов, о которых они даже.
Немного левая сторона поля Вашего вопроса, но если устройство хранения данных является беспокойством, можно хотеть изучить сжатие по алгоритму Хаффмана . Например, 00000001
мог быть сжат вниз частотой к чему-то эквивалентному {(7)0, (1)1}
. Более "рандомизированная" строка 00111010
потребовала бы более сложного представления, например, {(2)0, (3)1, (1)0, (1)1, (1)0}
, и заняла бы больше места. В зависимости от структуры Ваших разрядных данных можно извлечь некоторую пользу устройства хранения данных из ее использования, вне BitSet
.
Boolean[]
использование приблизительно 4-20 байтов за булево значение. boolean[]
использование приблизительно 1 байт за булево значение. BitSet
использование приблизительно 1 бит за булево значение. Емкость памяти не могла бы быть проблемой для Вас, в этом случае, булевская переменная [] могла бы быть более проста кодировать.
Это зависит как всегда. Да BitSet является большей памятью efficent, но как только Вы требуете, чтобы многопоточная булевская переменная доступа [] могла бы быть лучшим выбором. Например, для вычислительных начал Вы только устанавливаете булевскую переменную на истинный, и поэтому Вам действительно не нужна синхронизация. Hans Boehm написал немного работы об этом, и та же техника может использоваться для маркировки узлов в графике.
Движением от Java до ЦП является полностью конкретный VM. Например, это раньше было, что булевская переменная была на самом деле реализована как 32-разрядное значение (вполне, вероятно, верно по сей день).
, Если Вы не знаете, это будет иметь значение, что Вы - более обеспеченное написание кода, чтобы быть ясными, представить его и затем зафиксировать части, которые являются медленными или используют большую память.
можно сделать это, когда Вы идете. Например, я когда-то решил не назвать .intern () на Строках, потому что, когда я выполнил код в профилировщике, он замедлил его слишком много (несмотря на использование меньшей памяти).
Я полагаю, что BitSet является большей памятью - и эффективный ЦП, это, может внутренне упаковать биты в интервал, longs, или собственные типы данных, тогда как булевская переменная [] требует байта для каждого бита данных. Кроме того, если бы необходимо было использовать другие методы (и, или, и т.д.), то Вы нашли бы, что BitSet более эффективен, поскольку нет никакой потребности выполнить итерации через каждый элемент массива; поразрядная математика используется вместо этого.