阅读内核代码时,有时会看到likely ()和unlikely () )的判断语句,为什么要使用它们呢? 它们的区别是什么?
首先,明确了if(likely ) value )与if ) value )等价
if (unlikely value ) )也等效于if (value )
也就是说likely ()和unlikely () )从阅读和理解代码的角度来看是一样的!
这两个宏在内核中定义如下: #definelikely(x ) _builtin_expect ) ) x ),1 )。
#defineunlikely(x ) _builtin_expect ) ((x ),0 ) ) ) ) ) ) ) ) ) ) ) ) ) )。)
__builtin_expect () )由gcc(version=2.96 )提供给程序员,旨在为编译器提供“分支过渡”信息。 这样,编译器就可以优化代码,以减少由指令跳转导致的性能下降。
__builtin_expect((x ),1 )表示x的值为真的可能性更高;
__builtin_expect((x ),0 )表示x的值为假的可能性更高。
也就是说,使用 likely() ,执行 if 后面的语句 的机会更大,使用unlikely(),执行else 后面的语句的机会更大。
例如,在下面的代码中,作者认为prev很可能不等于next
likely (prev!=next () }
next-timestamp=now;
.
}else{
.
}