Разыменование указателя и сдвига для байтов? - PullRequest
2 голосов
/ 30 января 2012

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

Одна операция:

c |= (1 << i)

, в котором я хочу установить один бит в байте. Я думал о том, чтобы, возможно, использовать таблицу поиска, чтобы получить каждое из 8 значений для ИЛИ. Будет ли доступ к массиву быстрее или медленнее, чем просто операция с исходным битом?

Или, может быть, есть лучший способ?

Ответы [ 2 ]

6 голосов
/ 30 января 2012

На любой современной компьютерной архитектуре операция сдвига завершается за один цикл ЦП.Поиск таблицы может занять всего один цикл, если таблица находится в кэше ЦП;в противном случае это займет гораздо больше времени (возможно, в миллионы раз дольше, если память была перенесена на диск).

На старых процессорах ARM (серии 9 и более ранних) сдвиг занимает два цикла (при условии1003 * не является константой);в этом случае поиск в таблице может быть быстрее - один цикл, если базовый регистр таблицы уже настроен, таблица находится в кеше, а процессор вообще имеет кеш.

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

0 голосов
/ 30 января 2012

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

Использование таблицы поиска может предотвратить эту оптимизацию.

Палка с простым кодом. И посмотрите на сборку, созданную компилятором, она может вас удивить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...