可能对C++有更好的期望

ar2*_*015 1 c++ optimization branch-prediction c++20

根据C++分支感知预测,我准备了一个测试,看看它有多么有效.

所以,在对照样本中,我写道:

int count=0;
for (auto _ : state) {
    if(count%13==0) {
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}
Run Code Online (Sandbox Code Playgroud)

C++11分支预测中,我写道:

#define LIKELY(condition) __builtin_expect(static_cast<bool>(condition), 1)
#define UNLIKELY(condition) __builtin_expect(static_cast<bool>(condition), 0)

int count=0;
for (auto _ : state) {
    if(UNLIKELY(count%13==0)) {
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}
Run Code Online (Sandbox Code Playgroud)

在一个C++20,

int count=0;
for (auto _ : state) {
    if(count%13==0)[[unlikely]]{
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,不支持quick-bench.但无论如何,我把它留在那里.

现在,在gccclang下获得基准测试对于这样一个基本的例子没有效果.

我做错了吗?

c ++分支感知预测

YSC*_*YSC 5

您的工作台没有显示出差异,因为CPU的分支预测与gcc一样好,__builtin_expect可以优化您的简单示例.

有关分支预测的完整深入解释,请参阅Stack Overflow上的这个优秀答案.

  • @ ar2015 - 不.这意味着无论有没有`branch-prediction`提示,编译器都可以非常有效地优化像你这样的简单测试用例.如果你想真正运用这个特性,可以使用一个测试用例,编译器需要更多地进行优化,并且分支预测可能是一个更重要的考虑因素 (3认同)