【问题标题】:C/C++ most efficient if statement evaluationC/C++ 最高效的 if 语句求值
【发布时间】:2012-02-14 13:38:31
【问题描述】:

X 几乎 99.9% 的时间都是正确的,但我还需要处理 Y 和 Z。尽管 X 条件的主体是空的,但我认为如果省略 X 条件,它应该比可能检查其他 2 个条件 Y 和 Z 更快。你怎么看?

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

【问题讨论】:

  • 是什么让你觉得你需要担心这个?
  • 答案取决于你的逻辑。条件 X 总是 是否暗示非 Y 和非 Z?
  • @PaulR 因为它处于一个非常紧密的循环中。
  • 你已经分析过了?
  • @PaulR 的问题是“我需要担心这个吗?”或“最快的方法是什么?”

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


【解决方案1】:

像往常一样,当有疑问时;无论如何,如果我阅读该代码,我会发现更清晰的内容:

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

【讨论】:

  • 我不确定否定不太可能会按预期工作??我宁愿写unlikely(!x)。这意味着如果x 为false,则不会发生跳转。
  • @Ugo 我喜欢 Matteo 发布的解决方案,我改用了你的不太可能(!x)来重写它。
  • @Ugo:我认为likely(X) 是要评估的整个条件,就像在他的伪代码中一样......不过,我要表达的观点应该很清楚。
  • @MatteoItalia: likelyunlikely 是 GCC 提供的宏,它们包装了编译器特定的内置函数,无论条件是否可能,编译器提示。 (我认为 gcc 是 __builtin_expect
【解决方案2】:

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

我会亲自写

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

这意味着如果x,继续执行,否则跳转到if正文。

【讨论】:

    【解决方案3】:

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

    你可以使用__builtin_expect 之类的东西来控制它(正如 Ugo 所详述的那样)。

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

    【讨论】:

      【解决方案4】:

      你真的需要 y 和 z 上的不可能吗?从您的问题来看,如果 x 不正确,则 y 或 z 必须为真,在这种情况下,那些不太可能的错误是不正确的,我会这样做:

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

      (会对 Ugo 的回答发表评论,但我没有足够的声望离开 cmets。)

      【讨论】:

        猜你喜欢
        • 2018-08-04
        • 2021-11-22
        • 2016-10-27
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 2020-06-27
        相关资源
        最近更新 更多