X几乎是99.9%的时间,但我也需要处理Y和Z.虽然X条件的主体是空的,但我认为如果省略X条件,它应该比检查2个其他条件Y和Z更快。你觉得怎么样?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
答案 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的回答发表评论,但我没有足够的声誉留下评论。)