Я использую какой-то BitStream в своем коде, который имеет функцию read_bit()
. Эта функция называется очень часто (более одного миллиарда раз в одном потоке). Это то, что структура BITSTREAM выглядит следующим образом:Очень быстрый способ проверить бит набора в C
typedef struct BitStream {
unsigned char* data;
unsigned int size;
unsigned int currentByte;
unsigned char buffer;
unsigned char bitsInBuffer;
} BitStream;
И read_bit()
-функции определяется следующим образом:
unsigned char bitstream_read_bit(BitStream* stream, unsigned long long bitPos) {
unsigned int byte = bitPos/8;
unsigned char byteVal = stream->data[byte];
unsigned char mask = 128 >> (bitPos & 7);
if (mask & byteVal) {
return 1;
} else {
return 0;
}
}
Теперь я узнал, путем проб и ошибок, что линия unsigned char mask = 128 >> (bitPos & 7);
очень медленный. Есть ли способ ускорить проверку? Я уже пытался использовать массив, который индексирует 8 различных возможных масок, но это происходит не быстрее (я думаю, из-за доступа к памяти).
EDIT: Я пробовал много ответов за прошедшую неделю и выполнил множество тестов, но улучшения производительности не было. В итоге мне удалось добиться улучшения за 10 секунд, изменив порядок бит в потоке битов. Таким образом, вместо того, чтобы использовать маску 128 >> (bitPos & 7)
, я использовал функцию:
unsigned char bitstream_read_bit_2(BitStream* stream, const unsigned long long bitPos) {
unsigned int byte = (unsigned int) (bitPos/8);
unsigned char byteVal = stream->data[byte];
unsigned char mod = bitPos & 7;
return (byteVal & (1 << mod)) >> mod;
}
я, очевидно, также изменили соответствующую запись-функцию.
Как медленно в данный момент? Насколько «медленный» (но более быстрый, чем текущий) приемлем?Сколько памяти вы можете выделить для этого? Можете ли вы включить разборку текущей реализации? – Amit
Конкретная линия использует около 10 секунд из общего числа 28 секунд. По крайней мере, это возможно, чтобы заставить его работать за 5 секунд (или меньше). Я могу выделить для этого довольно немного памяти (не менее 10 МБ). Я скоро отправлю разборку. Заранее благодарю –
Замените '128 >> (bitPos & 7)' на массив статических масок. –