Я пишу какой-то аудио-код, где в основном все это крошечный цикл. Ошибки прогнозирования ветвей, как я их понимаю, - это довольно большая проблема с производительностью, и я изо всех сил стараюсь сохранить свободную ветку кода. Но до сих пор это может занять меня, что заставило меня задуматься о разных видах ветвления.Разница в производительности между предсказанием ветвей и предсказанием целевой ветви?
В C++, условный переход к фиксированной цели:
int cond_fixed(bool p) {
if (p) return 10;
return 20;
}
И (если я понимаю this question правильно), то безусловный переход к переменной цели:
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();
}
Есть ли разница в производительности? Мне кажется, что если один из двух методов был, очевидно, быстрее другого, то компилятор просто преобразил бы код, чтобы он соответствовал.
Для тех случаев, когда предсказание ветвлений имеет очень большое значение, Какие сведения о производительности полезны для изучения?
EDIT: Реальная работа x : 10 ? 20
это просто место держатель. Фактическая операция, следующая за ветвью, является, по крайней мере, достаточно сложной, что выполнение обоих неэффективно. Кроме того, если бы у меня было достаточно информации, чтобы разумно использовать __builtin_expect
, предсказание ветвления в этом случае было бы проблемой.
Какой процессор? Какой компилятор? Вы проверили сборку, чтобы узнать, какая из двух стратегий была выбрана? –
Примечание: компилятор не может преобразовать последний 'uncond_var', потому что он не знает полного набора возможных производных классов' base'. В общем случае * замкнутые * задачи (конечное число возможных входов) легче решить, чем * открытые *. –
@ MatthieuM. Компилятор GCC, процессор - все, что угодно, от настольных до смартфонов, хотя современный настольный процессор - моя текущая проблема. Кроме того, мне кажется странным, что компилятор не знает всех возможных производных классов базы. Он имеет весь исходный код, поэтому эта информация существует. И нет, я недостаточно знаком с собранием, чтобы ощутить продуктивное погружение в такие детали. Вот почему я перехожу на этот сайт, чтобы надеяться получить более высокий уровень понимания от кого-то, кто знает такие детали. – porgarmingduod