Я пишу некоторый звуковой код, где в основном все это крошечный цикл. Ошибки прогнозирования ветвей, как я их понимаю, - это довольно большая проблема с производительностью, и я изо всех сил стараюсь сохранить свободную ветку кода. Но есть только до сих пор, что может занять меня, что заставило меня задуматься о разных видах ветвления.
В С++ условная ветвь для фиксированной цели:
int cond_fixed(bool p) {
if (p) return 10;
return 20;
}
И (если я правильно понимаю этот вопрос), безусловная ветвь переменной цели:
struct base {
virtual int foo() = 0;
};
struct a : public base {
int foo() { return 10; }
};
struct b : public base {
int foo() { return 20; }
};
int uncond_var(base* p) {
return p->foo();
}
Есть ли различия в производительности? Мне кажется, что если один из двух методов был, очевидно, быстрее, чем другой, компилятор просто преобразил бы код, чтобы он соответствовал.
В тех случаях, когда предсказание ветвлений имеет очень большое значение, , какие сведения о производительности полезны для понимания?
РЕД.. Фактическая операция x : 10 ? 20
- это просто место. Фактическая операция, следующая за ветвью, является, по крайней мере, достаточно сложной, что выполнение обоих неэффективно. Кроме того, если бы у меня было достаточно информации, чтобы разумно использовать __builtin_expect
, предсказание ветвлений было бы не проблемой в этом случае.