Предполагая, что информация о профилировании верна, и это действительно операции приращения, которые вызывают узкое место, вы можете злоупотребить некоторым выполнением вне порядка:
for (byte_index = 0; byte_index < MASK_SIZE / NBBY; )
{
if (check_byte(mask,byte_index++))
{
condition_index = byte_index*NBBY;
for (bit_index=0; bit_index < NBBY; )
{
if (check_bit(condition_mask,condition_index + bit_index++))
{
...
}
}
}
}
(приведенный выше фрагмент не будет работать по понятным причинам, но вы должны понять:)
Кроме того, исходя из имен функций / макросов в вашем фрагменте C, я предполагаю, что вы работаете с битовыми масками, чтобы что-то делать. Одна вещь, которая помогла мне улучшить производительность ранее, это итерация по массиву масок, а не выполнение динамических вычислений на входе, то есть что-то вроде
for (byte_index = 0; byte_index < MASK_SIZE / NBBY; byte_index++)
{
if (check_byte(mask,byte_index))
{
const char masks[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
for (mask_index=0; mask_index < sizeof(masks) / sizeof(masks[0]); mask_index++)
{
if (check_bit(masks[mask_index], byte_index))
{
...
}
}
}
}
... который компилятор мог бы иметь больше шансов для оптимизации / развертывания должным образом.