Что лучше с точки зрения стоимости процессора? Сдвиг битов во время выполнения или сохранение всех возможных значений в массиве? - PullRequest
0 голосов
/ 28 апреля 2019

Я пишу код C ++ для MCU ESP8266 на платформе Arduino и пытаюсь сделать свой код максимально эффективным.

Чтобы управлять другим MCU через I2C, мне нужно настроить его внутренние компонентырегистры, которые хранят 8 бит.Чтобы установить бит вкл / выкл, я использую и битовую маску.

Один из способов сделать это - сдвинуть биты и применить битовую маску и (и) таким образом Установить i-й битв ноль? .

Но я также могу сохранить все 8 возможных значений сдвига в массиве, получить к ним прямой доступ и исключить выполнение сдвига битов.

Примерно так:

const unsigned int PINS[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};

...

pt = pt & ~(PINS[i]);

Вместо:

pt = pt & ~(1 << i);

Я думаю, что это может быть хуже в зависимости от того, как компилятор MCU будет работать над этим.Доступ к массивам через индекс стоит больше?Значения массива будут в регистрах процессора?Я переигрываю оптимизацию?Есть еще один вариант?

Можете ли вы помочь мне с пониманием этого вопроса?

1 Ответ

2 голосов
/ 28 апреля 2019

Если вы находитесь на (и нуждаетесь) в этом уровне оптимизации, вы находитесь в точке, где вам нужно будет декомпилировать код и посмотреть, что именно построил компилятор.

Если вы действительно хотите оптимизировать оттуда, я бы предложил написать пользовательскую функцию сборки, которая обеспечивает оптимальную работу цикла (верно?).Это боль, но оптимизация, которую вы рассматриваете, имеет порядок отдельных циклов.

Даже в этот момент это, вероятно, не будет иметь значения, оптимизации, такие как развертывание цикла, будут гораздо более существенными, чем две быстрые операции.

...