Как часть проекта, мне нужно выполнить вычисления маски в большой петле (около 10^6 до 10^7 повторений). Мне нужно сохранить любое количество наименее значимых битов (1-8) или любой бит в определенной позиции (7-0, где 7 - самый старший бит). Чтобы не вычислять Маски в главном коде - и для производительности, я придумал следующие идеи (в каждом случае параметр представляет собой знак без знака от 0 до 7):Предварительно просчитанные маски для производительности
1) Используйте два глобальных массива определенному в файле заголовка (скажем, bitops.h):
char mask[8] = {1, 3, 7, 15, 31, 63, 127, 255};
char position[8] = {1, 2, 4, 8, 16, 32, 64, 128};
, где нам, возможно, придется ждать из-за латентности памяти.
2) Рассчитайте маски с помощью простых операций (с помощью макросов):
#define mask(x) ((1 << (x + 1)) - 1)
#define position(x) (1 << x)
, где нам потребуется около 3 тактов для маски и только 1 для позиции.
Что вы предлагаете? Является ли второй вариант более быстрым, или процессор будет кэшировать константы заранее, если я пойду первым?
Спасибо за ваше время!
У вас есть проблемы с производительностью? –
Вы всегда можете поместить маски в регистры и быть супербыстро. –
Я не могу поместить маски в регистры, потому что мне нужно получить к ним доступ с помощью индекса. Индекс будет играть ту же роль, что и x в макросе. – someone