Linux内核中的likely()与unlikely(…

在2.6内核中,随处可见likely()与unlikely(),下面就来分析一下他们的区别。首先要明确一点:

if(likely(value))等价于if(value);if(unlikely(value))也等价于if(value),也就是说从阅读和理解代码的角度来看,likely()与unlikely()是一样的。
在2.6.28内核中,这两个宏的定义如下:
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(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后面语句的机会更大。通过这种方式,编译器在编译过程中会将可能性更大的代码紧跟着前面的代码,这样就减少了指令跳转带来的性能上的下降。

例如上篇日志中的 IS_ERR_VALUE宏定义:
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
可以这样理解,x >= (unsigned long)-MAX_ERRNO 的可能性要小,也就是说x为错误指针的可能性要小,这也完全符合实际情况,因为内核函数返回指针出错的概率要比正确的概率小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值