булевская переменная [] по сравнению с BitSet: Который более эффективен?

={"PRODUCT", "CATEGORY"; 
 INDEX(SPLIT(A2:A, "/"), , 4), 
 INDEX(SPLIT(A2:A, "/"), , 5)}

63
задан Community 6 March 2017 в 08:44
поделиться

6 ответов

От некоторых сравнительных тестов с Sun JDK 1.6 вычислительные начала с решетом (лучший из 10 повторений для нагреваний дайте JIT-компилятору шанс и исключите случайные задержки планирования, Core 2 Duo T5600 1.83 ГГц):

BitSet является большей памятью, эффективной, чем булевская переменная [] за исключением очень небольших размеров. Каждая булевская переменная в массиве берет байт. Числа от runtime.freeMemory () немного запутаны для BitSet, но меньше.

булевская переменная [] является большим количеством ЦП, эффективного за исключением очень больших размеров, где они о даже. Например, для размера 1 миллион булевских переменных [] приблизительно в четыре раза быстрее (например, 6 мс по сравнению с 27 мс), для десять и сто миллионов, о которых они даже.

39
ответ дан starblue 24 November 2019 в 16:25
поделиться

Немного левая сторона поля Вашего вопроса, но если устройство хранения данных является беспокойством, можно хотеть изучить сжатие по алгоритму Хаффмана . Например, 00000001 мог быть сжат вниз частотой к чему-то эквивалентному {(7)0, (1)1}. Более "рандомизированная" строка 00111010 потребовала бы более сложного представления, например, {(2)0, (3)1, (1)0, (1)1, (1)0}, и заняла бы больше места. В зависимости от структуры Ваших разрядных данных можно извлечь некоторую пользу устройства хранения данных из ее использования, вне BitSet.

4
ответ дан Alex Reynolds 24 November 2019 в 16:25
поделиться
  • Boolean[] использование приблизительно 4-20 байтов за булево значение.
  • boolean[] использование приблизительно 1 байт за булево значение.
  • BitSet использование приблизительно 1 бит за булево значение.

Емкость памяти не могла бы быть проблемой для Вас, в этом случае, булевская переменная [] могла бы быть более проста кодировать.

41
ответ дан Michael Myers 24 November 2019 в 16:25
поделиться

Это зависит как всегда. Да BitSet является большей памятью efficent, но как только Вы требуете, чтобы многопоточная булевская переменная доступа [] могла бы быть лучшим выбором. Например, для вычислительных начал Вы только устанавливаете булевскую переменную на истинный, и поэтому Вам действительно не нужна синхронизация. Hans Boehm написал немного работы об этом, и та же техника может использоваться для маркировки узлов в графике.

3
ответ дан jcsahnwaldt 24 November 2019 в 16:25
поделиться

Движением от Java до ЦП является полностью конкретный VM. Например, это раньше было, что булевская переменная была на самом деле реализована как 32-разрядное значение (вполне, вероятно, верно по сей день).

, Если Вы не знаете, это будет иметь значение, что Вы - более обеспеченное написание кода, чтобы быть ясными, представить его и затем зафиксировать части, которые являются медленными или используют большую память.

можно сделать это, когда Вы идете. Например, я когда-то решил не назвать .intern () на Строках, потому что, когда я выполнил код в профилировщике, он замедлил его слишком много (несмотря на использование меньшей памяти).

1
ответ дан TofuBeer 24 November 2019 в 16:25
поделиться

Я полагаю, что BitSet является большей памятью - и эффективный ЦП, это, может внутренне упаковать биты в интервал, longs, или собственные типы данных, тогда как булевская переменная [] требует байта для каждого бита данных. Кроме того, если бы необходимо было использовать другие методы (и, или, и т.д.), то Вы нашли бы, что BitSet более эффективен, поскольку нет никакой потребности выполнить итерации через каждый элемент массива; поразрядная математика используется вместо этого.

-1
ответ дан Kevin Lacquement 24 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: