(Отказ от ответственности: следующее касается оптимизаций очень низкого уровня, которые чаще всего не нужны. Если вы продолжаете читать, вы отказываетесь от своего права жаловаться, что компьютеры работают быстро, и нет никаких причин беспокоиться о подобных вещах .)
Одним из преимуществ исключения оператора if
является то, что вы избегаете штрафов за предсказание ветвлений.
Штрафы за предсказание ветвления, как правило, являются проблемой только тогда, когда ветвление сложно предсказать. Ветвь легко прогнозируется, когда она почти всегда берется / не берется, или она следует простому шаблону. Например, ответвление в операторе цикла берется каждый раз, кроме последнего, поэтому его легко предсказать. Однако, если у вас есть код вроде
a = random() % 10
if (a < 5)
print "Less"
else
print "Greater"
тогда эта ветвь не может быть легко предсказана и будет часто вызывать штраф за предсказание, связанный с очисткой кэша и откатом инструкций, которые были выполнены в неправильной части ветки.
Одним из способов избежать такого рода штрафов является использование троичного (?:
) оператора. В простых случаях компилятор будет генерировать инструкции условного перемещения, а не ветви.
So
int a, b, low;
if (a < b) low = a;
else low = b;
становится
int a, b, low;
low = (a < b) ? a : b
и во втором случае инструкция ветвления не требуется. Кроме того, он намного понятнее и удобочитаемее, чем ваша реализация с переворотом.
Конечно, это микрооптимизация, которая вряд ли окажет значительное влияние на ваш код.