Настройки нескольких битов в битсете - PullRequest
0 голосов
/ 28 января 2019

Я работаю в игрушечной файловой системе, я использую bitset для отслеживания используемых и неиспользуемых страниц.Я использую array из int с (чтобы использовать встроенные битовые операции GCC) для представления bitset.Я не использую std::bitset, так как он не будет доступен в конечной среде (встроенная система).

Теперь, согласно Linux perf, во время тестов на выделение файлов уходит 35% времени выполнения, 45% времени теряется при установке битов, используя

#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))

внутри цикла.Согласно отчету 42% времени теряется в or.Удаление происходит немного быстрее, но тогда большая часть времени теряется в операции and, чтобы очистить биты. Переключение битов с помощью xor не имеет значения.

В принципе, мне интересно, есть ли более разумные способы установки нескольких битовна одном дыхании.Если пользователь запрашивает 10 страниц пространства, просто установите все биты за один раз, но проблема в том, что пространство может охватывать word границы.или какие-либо особенности GCC / Clang, о которых мне следует знать?

1 Ответ

0 голосов
/ 22 февраля 2019

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

void set_mask(word_t* bitset, word_t mask, int lowbit) {
  int index= lowbit / sizeof(word_t);
  int offset = lowbit % sizeof(word_t);
  bitset[index] |= (mask << offset);
  mask >>= (sizeof(word_t) - offset);
  bitset[index+1] |= mask
}

Если маска не выходит за границы, 2-е слово равно ORd с 0, поэтомуэто без изменений.Делать это безоговорочно может быть быстрее, чем тест, чтобы увидеть, нужно ли это делать.Если тестирование показывает обратное, добавьте if (mask) перед последней строкой.

...