Когда следует быть осторожным, используя битовый набор вместо массива bool? - PullRequest
2 голосов
/ 07 декабря 2009

Я работаю над приложением для мобильного телефона и вижу потенциальную возможность для повышения производительности. Во всем коде я использую массивы bool, чтобы отслеживать, какие объекты активны. Например, я бы проверил, активен ли i-й MyObject, выполнив следующее:

if(activeMyObjects[i]){ // it's active so do something... }

Поскольку максимальное количество моих объектов находится в диапазоне [5,20], я думаю, что я могу заменить массив bool activeMyObjects набором битов в виде единого целого числа «activeMyObjects». Тогда я могу сделать следующее:

// check if ith object is active
if(activeMyObjects & (1 << i)){ // it's active... }

// activate the ith object
activeMyObjects |= (1 << i);

// reset all myObjects to inactive
activeMyObjects = 0;

// and so on...

Есть ли случаи, когда переключение на набор битов может фактически ухудшить производительность? Я использую язык c. Также обратите внимание, что этот код вызывается очень часто (частота в диапазоне 30 - 60 Гц).

Edit: Еще одна информация: у наборов битов есть еще одно преимущество: я могу легко определить, активен ли вообще какой-либо из объектов. поэтому я могу пропустить цикл, где я проверяю каждый элемент, чтобы увидеть, активен ли он, сначала проверив if (activeMyObjects). когда я использую массив, это сложнее ... мой подход заключался в том, чтобы иметь дополнительный счетчик int, который увеличивается всякий раз, когда MyObject активируется, и уменьшается всякий раз, когда MyObject деактивируется ... таким образом, я просто проверю, если (activeMyObjectsCount> 0) перед циклом, где я проверяю каждый из них.

Ответы [ 5 ]

3 голосов
/ 07 декабря 2009

В зависимости от того, как часто выделяется набор битов, вы можете легко занять больше памяти с версией набора битов.

Код для доступа к определенному биту намного больше, чем код для доступа к полному байту памяти - если будет только горстка этих массивов, но к ним часто обращаются, вы получите меньший объем, оставляя как есть.

2 голосов
/ 07 декабря 2009

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

1 голос
/ 07 декабря 2009

Мне сказали, что некоторые чипы PowerPC (не знаю, все ли они или нет - см., Например, этот вопрос ) медленны в выполнении битовых сдвигов переменной длины, как вы делаете с ваши (1 << i) инструкции. Так что на этих чипах вполне вероятно, что битовый набор будет работать значительно медленнее, чем массив bool.

Это не может быть проблемой для вас, но это интересный маленький случай:)

1 голос
/ 07 декабря 2009

Если скорость важнее, чем объем памяти (поскольку это мобильное приложение в целом), вы можете хранить маски в массиве и получать к ним доступ как activeMyObjects & mask [i].

1 голос
/ 07 декабря 2009

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

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