Это в первом ответе за первую ссылку - насколько это важно в большой схеме вещей. Единственная часть, когда вы проверяете биты:
- Низкоуровневые драйверы. Однако, если вы пишете тот, который вы, вероятно, знаете ASM, он достаточно привязан к системе, и, вероятно, большинство задержек происходит при вводе / выводе
- Тестирование на флаги. Обычно это происходит либо при инициализации (только один раз в начале), либо при некоторых общих вычислениях (что занимает гораздо больше времени).
Общее влияние на производительность приложений и макробенчмарков, вероятно, будет минимальным, даже если микробенчмарки показывают улучшение.
Для части Edit - использование только bts
не гарантирует элементарность операции. Все это гарантирует, что это ядро будет на этом ядре (так же, как и or
сделано в памяти). На многопроцессорных устройствах (необычных) или многоядерных (очень распространенных) вам все равно придется синхронизироваться с другими процессорами.
Поскольку синхронизация намного дороже, я верю, что разница между:
asm("lock bts %0, %1" : "+m" (*array) : "r" (bit));
и
asm("lock or %0, %1" : "+m" (*array) : "r" (1 << bit));
минимально. И вторая форма:
- Можно установить несколько флагов одновременно
- Иметь приятную
__sync_fetch_and_or (array, 1 << bit)
форму (насколько я помню, работает на gcc и intel compiler).