c++ - 分支预测和分支目标预测之间的性能差异?

标签 c++ performance branch-prediction

我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我努力保持代码分支自由。但我只能走这么远,这让我想知道不同类型的分支。

在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,在这种情况下分支预测将不是问题。

最佳答案

旁注:如果你有这样的代码

if (p) a = 20; else a = 10;

然后没有任何分支。编译器正在使用条件移动(参见:Why is a conditional move not vulnerable for Branch Prediction Failure?)

关于c++ - 分支预测和分支目标预测之间的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21755471/

相关文章:

c++ - 将对话框控件移动到选项卡中?

c++ - CMake:如何指定自定义导入库名称(MSVC)

Java方法直接调用与单元素循环调用

swift - 为什么 Swift 在 for-in 循环中使用下标语法比直接访问元素更快?

c++ - 为什么这个C++函数会产生如此多的分支错误预测?

performance - 分支预测变量与此同时起作用吗?

C++ 非常简单的线程?

c++ - 做复合 C++ 时成员函数重载错误

java - Java声音回放和数据图协调的预录文件

java - Mahout:(快速性能)如何将首选项写入文件?