我正在寫一些音頻代碼,基本上一切都是一個小循環。據我瞭解,分支預測失敗是一個足夠大的性能問題,我很難保持代碼分支免費。但是,只有到目前爲止,可以帶我,這讓我想知道不同種類的分支。分支預測與分支目標預測之間的性能差異?
在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();
}
是否有性能差異?在我看來,如果兩種方法中的一種明顯比另一種快,編譯器會簡單地將代碼轉換爲匹配。
對於分支預測非常重要的情況,有關性能的詳細信息有助於瞭解?
編輯:x : 10 ? 20
的實際操作僅僅是一個佔位符。分支之後的實際操作至少非常複雜,以至於兩者效率不高。此外,如果我有足夠的信息來明智地使用__builtin_expect
,在這種情況下分支預測就不成問題。
哪個CPU?哪個編譯器?你是否檢查了會議以瞭解採取哪兩種策略? –
注意:編譯器不能轉換後者'uncond_var',因爲它不知道'base'的可能派生類的完整集合。一般而言,* closed *問題(有限數量的可能輸入)比* open *問題更容易解決。 –
@MatthieuM。編譯器GCC,處理桌面到智能手機的任何東西,儘管現代桌面CPU是我目前關心的問題。另外,我覺得編譯器不知道所有可能的基類派生類,這似乎很奇怪。它有所有的源代碼,所以這個信息存在。不,我對集會感到不夠熟悉,無法感受到這種細節。這就是爲什麼我轉向這個網站,希望從知道這些細節的人那裏得到更高層次的理解。 – porgarmingduod