Добавление против производительности ORing
Я видел, как люди используют сложение, где побитовое ИЛИ было бы более концептуально подходящим, потому что они считают, что это быстрее. Это правда? Если да, все ли современные компиляторы знают этот трюк?
4 ответа
"Концептуально уместно" и "быстрее" - это две разные вещи. Первый - это семантика, а второй часто включает в себя разрыв семантики.
Что касается вопроса в заголовке, то по скорости очень небольшая (если есть) разница. Компилятор для процессора, где это действительно происходит, обычно все равно оптимизирует его - если это не приводит к разным результатам, что он очень хорошо может и обычно будет.
Напишите свой код правильно - если вы имеете в виду ИЛИ, то ИЛИ. Если add-vs-OR заканчивается быстрее, либо ваш компилятор сделает это за вас, либо вы можете изменить его позже, после того как вы определили, стоит ли потенциальная дополнительная полнаносекунда за итерацию затратой на читаемость и такими ошибками изменение может вызвать.
И сложение, и логическое ИЛИ, вероятно, выполняются в аналогичной части АЛУ ЦП. Маловероятно, что будет какая-либо измеримая разница в производительности, но это можно было бы измерить в вашей ситуации.
Компиляторам не нужно беспокоиться об этом, потому что обычно единственный способ, которым компилятор может знать, что сложение и ORing дадут одинаковый результат, это если операнды являются константами, и в этом случае компилятор может просто выполнять арифметику во время компиляции, а не даже придется генерировать код для него.
На самом деле, компиляторы, как правило, достаточно умны, чтобы сделать эту замену подходящей, так или иначе. Термин для такого рода оптимизации означает снижение прочности, и это самый старый трюк в книге.
Обычно это не быстрее и неправильно, если вы не знаете, что "добавляете" 1 к четному адресу или значению.