2013-07-16 1 views
1

Как часть проекта, мне нужно выполнить вычисления маски в большой петле (около 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 для позиции.

Что вы предлагаете? Является ли второй вариант более быстрым, или процессор будет кэшировать константы заранее, если я пойду первым?

Спасибо за ваше время!

+1

У вас есть проблемы с производительностью? –

+0

Вы всегда можете поместить маски в регистры и быть супербыстро. –

+0

Я не могу поместить маски в регистры, потому что мне нужно получить к ним доступ с помощью индекса. Индекс будет играть ту же роль, что и x в макросе. – someone

ответ

1

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

+0

Фактически код является частью алгоритма стеганографии. Данные скрыты внутри изображения. Таким образом, чем быстрее, тем лучше! – someone

+0

спасибо за ваш ответ! – someone

1

Я ожидаю, что первое будет лучше, потому что массивы всегда должны быть в кеше. Если вы хотите быть уверенным, вы должны сравнить его.

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

+0

спасибо, что ответили! – someone

Смежные вопросы