Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970200
  • 博文数量: 120
  • 博客积分: 6454
  • 博客等级: 准将
  • 技术积分: 1739
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-28 17:45
文章分类

全部博文(120)

文章存档

2014年(1)

2013年(1)

2012年(11)

2011年(16)

2010年(6)

2009年(11)

2008年(30)

2007年(44)

分类: C/C++

2011-07-01 17:43:09

在内核代码中时常 会看到 unlikely 和 likely 的踪影。他们实际上是解释在 linux/compiler.h 中的两个宏:

  1.   #define likely(x) __builtin_expect(!!(x), 1)
  2.   #define unlikely(x) __builtin_expect(!!(x), 0)
这里的 __built_expect() 函数是 gcc 的内建函数。
至于为什么要在内核代码中运用这两个宏,首要的目标是为了实行代码的优化,提高系统执行速度。
比如 :
  1. if (likely(a>b)) {
  2.      fun1();
  3.   }
  4.   if (unlikely(a<b))
  5.      fun2();
这里就是程序员可以确定 a>b 在程序执行流程中出现的可能相比较大,因此运用了 likely() 告诉编译器将 fun1() 函数的二进制代码紧跟在前面程序的后面,这样就 cache 在预取数据时就可以将 fun1() 函数的二进制代码拿到 cache 中。这样,也就添加了 cache 的命中率。
同样的,unlikely() 的作用就是告诉编译器,a
咱们不用对 likely 和 unlikely 感到迷惑,须要知晓的就是 if(likely(a>b)) 和 if(a>b) 在功能上是等价的,同样 if(unlikely(a
比如下面的代码:
  1. #include <stdio.h>
  2. #define unlikely(x) __builtin_exp ect(!!(x), 0)
  3. #define likely(x) __builtin_exp ect(!!(x), 1)

  4. int main()
  5. {
  6.     int a=2,b=4;
  7.     if(unlikely(a<b)) {
  8.         printf("in the unlikely,is not your exp ecting!\n");
  9.     } else {
  10.         printf("in the unlikely, is your exp ecting\n");
  11.     }
  12.     if(likely(a<b)) {
  13.         printf("in the likely, is your exp ecting\n");
  14.     }
  15.     return 0;
  16. }
执行结果:
  1. in the unlikely,is not your exp
  2. in the likely, is your exp ecting
总之,likely 和 unlikely 的功能就是添加 cache 的命中率,提高系统执行速度。

阅读(2535) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~