likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?
首先明确:
if (likely(value))等价于if (value)
if (unlikely(value))等价于if (value)

也就是说likely()和unlikely()从阅读和理解的角度是一样的。
这两个宏在内核中定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
这里的__built_expect()函数是gcc(version >= 2.96)的内建函数,提供给程序员使用的,目的是将"分支转移"的信息提供给编译器,这样编译器对代码进行优化,以减少指令跳转带来的性能下降。
__buildin_expect((x), 1)表示x的值为真的可能性更大.
__buildin_expect((x), 0)表示x的值为假的可能性更大.
也就是说,使用likely(),执行if后面的语句的机会更大,使用unlikely(),执行else后面的语句机会更大一些。

通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着后面的代码,从而减少指令跳转带来的性能上的下降。
比如 :
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)在功能上是等价的。
  比如下面的代码:
  #include
  #define unlikely(x) __builtin_exp ect(!!(x), 0)
  #define likely(x) __builtin_exp ect(!!(x), 1)
      int main()
  {
  int a=2,b=4;
      if(unlikely(a<=b))
  printf("in the unlikely,is not your expecting!\n");
  } else {
   printf("in the unlikely, is your exp ecting\n");
  }
  if(likely(a<=b))
  printf("in the likely, is your exp ecting\n");
  }
  return 0;
  }
  执行结果:
  in the unlikely,is not your exp ecting!
  in the likely, is your exp ecting
总之,likely和unlikely的功能就是添加cache的命中率,提高系统执行速度.

转自:http://blog.chinaunix.net/uid-25409479-id-158584.html

最新文章

  1. JavaScript中的面向对象
  2. ASP.NET中使用DropDownList实现无刷新二级联动详细过程
  3. ionic之AngularJS扩展 移动开发(视图导航一)
  4. javaWeb---Servlet
  5. Apache:如何利用.htaccess文件对PHP网站或文件进行伪静态处理
  6. cognos 10.2.2 搭建网关做负载均衡
  7. uva - The Lottery(容斥,好题)
  8. eclipse导入SVN上的Maven多模块项目
  9. 发布 Rafy .NET Standard 版本 Nuget 包
  10. 104 - kube-scheduler源码分析 - predicate整体流程
  11. Windows下安装Redis服务
  12. input ,button, textarea 1)使用disabled , 2) 显示值, 3) 表单提交. 4) jquery.form.js ajaxSubmit() 无刷新ajax提交表单.
  13. canner CMS 系统 (公司在台湾) https://www.canner.io/
  14. 代码管理(五)git 删除分支
  15. Nios ii调试问题集
  16. Oracle EBS 有效银行账户取值
  17. Linux下编译安装qemu和libvirt【转】
  18. npm 安装 不快的解决办法
  19. python collection系列
  20. XML约束技术

热门文章

  1. 【BZOJ3895】取石子(博弈,记忆化搜索)
  2. day5感想
  3. MSP430G2553头文件解析
  4. 安装配置Vim中文帮助文档
  5. flashcache 介绍
  6. Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)
  7. 网络请求失败记录(安卓4g网络下第一次请求特别慢或者失败)
  8. MySQL的XA_prepare_event类型binlog的解析
  9. NYOJ 20.吝啬的国度-DFS+STL(vector保存上一节点)
  10. HDU 1269.迷宫城堡-Tarjan or 双向DFS