如果语句评估,C / C ++最有效

时间:2012-01-19 21:45:14

标签: c++ c gcc if-statement branch-prediction

X几乎是99.9%的时间,但我也需要处理Y和Z.虽然X条件的主体是空的,但我认为如果省略X条件,它应该比检查2个其他条件Y和Z更快。你觉得怎么样?

if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}

4 个答案:

答案 0 :(得分:11)

您可能想知道在使用可能或不太可能时会发生什么: http://kerneltrap.org/node/4705

我个人会写

if (unlikely(!X))
{
  if (unlikely(Y))
  {
  ...
  }
  else if (unlikely(Z))
  {
   ...
  }
}

这意味着x,继续执行,否则跳转到身体。

答案 1 :(得分:8)

像往常一样,当有疑问时;无论如何,如果我阅读那段代码,我会发现更清楚的东西:

if (!likely(X))
{
    if (unlikely(Y))
    {
    ...
    }
    else if (unlikely(Z))
    {
    ...
    }
}

答案 2 :(得分:1)

如果编译器要假设,它通常会支持第一个条件为真。

您可以使用__builtin_expect之类的东西来控制它(如Ugo详细说明)。

如果它处于循环中,你应该测量,因为硬件也是一个考虑因素 - 它不仅仅是源和编译器。您的缓存如何,以及分支预测如何为您服务?轮廓。改变。轮廓。进行比较。

答案 3 :(得分:0)

你真的需要y和z的不太可能吗?这听起来像你的问题,如果x不是真的,那么y或z必须是真的,在这种情况下那些不太可能的是不正确的,我会用这个:

if (unlikely(!X))
{
  if (Y)
  {
  ...
  }
  else //Z must be true
  {
   ...
  }
}

(本来可以对Ugo的回答发表评论,但我没有足够的声誉留下评论。)