我正在编写一些音频代码,基本上所有内容都是一个小循环。据我了解,分支预测失败是一个足够大的性能问题,我很难保持代码分支自由。但我只能到此为止,这让我想知道不同种类的分支。
在 c++ 中,条件分支到固定目标:
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
,那么在这种情况下,分支预测将不是问题。