分支预测和分支目标预测之间的性能差异
Performance difference between branch prediction and branch target prediction?
我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但我只能走这么远,这让我想知道不同种类的分支。
在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();
}
是否存在性能差异在我看来,如果这两种方法中的一种明显比另一种快,编译器只需转换代码即可匹配。
对于分支预测非常重要的情况,了解哪些有关性能的详细信息是有用的
EDIT:x : 10 ? 20
的实际操作只是一个占位符。分支之后的实际操作至少足够复杂,以至于两者都做是低效的。此外,如果我有足够的信息来合理地使用__builtin_expect
,那么在这种情况下,分支预测将不是问题。
附带说明:如果您有类似的代码
if (p) a = 20; else a = 10;
那么就没有任何分支了。编译器正在使用条件移动(请参阅:为什么条件移动不易受到分支预测失败的攻击?)
您没有提到您的编译器。我曾经将GCC用于一个性能关键型应用程序(实际上是我所在大学的一场竞赛),我记得GCC有__builtin_expect
宏。我检查了代码中的所有条件,最终获得了5-10%的加速,我发现这很神奇,因为我几乎注意到了我所知道的一切(内存布局等),而且我没有改变任何关于算法本身的事情。
顺便说一下,该算法是一个相当基本的深度搜索。我在Core 2 Duo上运行了它,但不确定是哪一个。
相关文章:
- 大小相等但成员数量不同的结构之间的性能差异
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 不同的类或结构初始化方法之间的性能差异是什么?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 列表和forward_list性能之间的区别?
- 指针和程序性能之间有什么关系吗?
- 设置::查找和查找之间的性能差异<algorithm>
- 不同机器之间的标准时钟性能差异显著
- 在C++中找不到 AoS 和 SoA 之间的性能差异
- 矢量和数组之间的性能差距<bool>
- 按位 XOR 与求和之间的性能差异似乎不存在
- 返回本地静态的函数和返回静态成员的函数之间有什么区别(对象大小、性能等)?
- unordered_set与链接列表之间的性能比较
- POD和非POD类之间的性能差异
- 分支预测和分支目标预测之间的性能差异
- 与表达式或变量进行比较之间的性能差异
- 在性能和内存使用方面,“静态const”,“ #define”和“枚举”之间的差异
- 对于高度优化的矩阵多应用程序代码,MSVC和GCC之间的性能差异
- 为什么链接到librt会在g++和clang之间交换性能
- 使用编译代码和 PHP 加速器来提高性能之间的差异