注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

(转载)unlikely和likely  

2012-09-20 23:49:08|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在内核代码中经常会看到unlikely和likely的踪影。他们实际上是定义在 linux/compiler.h 中的两个宏。
#define likely(x)    __builtin_expect(!!(x), 1)
#define unlikely(x)  __builtin_expect(!!(x), 0)
这里的__built_expect()函数是gcc的內建函数。
至于为什么要在内核代码中使用这两个宏,主要的目的是为了进行代码的优化,提高系统执行速度。
比如 :
if (likely(a>b)) {
fun1();
}
if (unlikely(a<b)) {
fun2();
}
这里就是程序员可以确定 a>b 在程序执行过程中出现的可能相比较大,因此使用了likely()告诉编译器将fun1()函数的二进制代码紧跟在前面程序的后面,这样就cache在预取数据时就可以将fun1()函数的二进制代码拿到cache中。这样,也就增加了cache的命中率。
同样的,unlikely()的作用就是告诉编译器,a<b 的可能性很小所以这里在编译时,将fun2()的二进制代码尽量不要和前边的编译在一块。
我们不用对likely和unlikely感到迷惑,需要知道的就是 if(likely(a>b)) 和 if(a>b)在功能上是等价的,同样 if(unlikely(a<b)) 和 if(a<b) 的功能也是一样的。不一样的只是他们声称的二进制代码有所不同,这一点我们也可以从他们的汇编代码中看到。
比如下面的代码:
01
#include <stdio.h>
02
#define unlikely(x) __builtin_expect(!!(x), 0)
03
#define likely(x) __builtin_expect(!!(x), 1)
04
  int main()
05
  {
06
  int a=2,b=4;
07
  if(unlikely(a<b)) {
08
  printf("in the unlikely,is not your expecting!\n");
09
  } else {
10
  printf("in the unlikely, is your expecting\n");
11
  }
12
  if(likely(a<b)) {
13
  printf("in the likely, is your expecting\n");
14
  }
15
  return 0;
16
  }
执行结果:
in the unlikely,is not your expecting!
in the likely, is your expecting
总之,likely和unlikely的功能就是增加cache的命中率,提高系统执行速度。
  评论这张
 
阅读(361)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017