X 几乎 99.9% 的时间都是正确的,但我也需要处理 Y 和 Z。尽管 X 条件的主体是空的,但我认为如果省略 X 条件,它应该比可能检查其他 2 个条件 Y 和 Z 更快。你怎么看?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
X 几乎 99.9% 的时间都是正确的,但我也需要处理 Y 和 Z。尽管 X 条件的主体是空的,但我认为如果省略 X 条件,它应该比可能检查其他 2 个条件 Y 和 Z 更快。你怎么看?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
您可能想知道当您使用可能或不太可能时究竟会发生什么:http:
//kerneltrap.org/node/4705
我会亲自写
if (unlikely(!X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
这意味着 if x
,继续执行,否则跳转到 if 正文。
像往常一样,当有疑问时;无论如何,如果我要阅读该代码,我会发现更清晰的内容,例如:
if (!likely(X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
如果编译器假设,它通常会支持第一个条件为真。
你可以使用类似的东西__builtin_expect
来控制它(如 Ugo 详述)。
如果它处于循环中,则应该进行测量,因为硬件也是一个考虑因素——不仅仅是源代码和编译器。您的缓存如何,分支预测如何为您工作?轮廓。改变。轮廓。相比。
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.)