Предсказание ветвлений и оптимизированный код
У меня есть следующий набор блоков кода, назначение обоих блоков одинаково. Мне пришлось реализовать 2-й блок, чтобы избежать обратной логики и повысить читабельность. Кстати, в производственном коде условие очень сложное.
Вопрос - я знаю, что ветвление - это плохо, сколько пенальти я должен заплатить. Так же, как дополнительная информация, также учтите, что вероятность появления ветки else очень высока.
X = Get_XValue()
if (X != 5)
{
K = X+3;
.
.
}
X = Get_XValue()
if (X == 5)
{
/*do nothing*/
}
else
{
K = X+3;
.
.
}
1 ответ
Это все сводится к вашему компилятору. Хороший оптимизирующий компилятор обнаружит, что then
-clause во втором примере пусто и обратный тест. Таким образом, он будет генерировать один и тот же код для обоих случаев, поэтому не должно быть никакого наказания.
В качестве дополнительного примечания могу добавить, что это относится ко всем трем компиляторам, которые я пробовал (clang, gcc и iccarm),