8

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

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

4 回答 4

11

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

我会亲自写

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

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

于 2012-01-19T22:03:58.223 回答
8

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

if (!likely(X))
{
    if (unlikely(Y))
    {
    ...
    }
    else if (unlikely(Z))
    {
    ...
    }
}
于 2012-01-19T21:49:39.030 回答
1

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

你可以使用类似的东西__builtin_expect来控制它(如 Ugo 详述)。

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

于 2012-01-19T22:09:30.703 回答
0

Do you really need the unlikely's on y and z? It sounds from your question like if x is not true, then y or z must be true, in which case those unlikely's are incorrect and I would go with this:

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

(Would have made this a comment on Ugo's answer, but I don't have enough reputation to leave comments.)

于 2012-08-10T10:34:01.953 回答