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

I choose

sailing with my heart ......

 
 
 

日志

 
 

likely和unlikely  

2016-09-11 15:06:30|  分类: Linux协议栈 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
linux内核代码中很多if条件判断语句是类似这样的:if(likely( )){}或是if(unlikely( ))。
实际上likely和unlikely并不影响if条件的判断结果和实际执行路径,只是一个编译器优化宏,定义位于/include/linux/compiler.h中,
具体定义如下:
#define likely(x) __builtin_expect(!!(x), 1)      //告诉编译器,大部分情况条件成立
#define unlikely(x) __builtin_expect(!!(x), 0)  //告诉编译器,大部分情况条件不成立
那么这两个宏是如何实现优化,提高执行效率的呢?
目前大部分体系结构中都按照流水线执行指令,前一条指令还没有执行完成,后面的指令已经被处理器读取并开始处理。那么对于分支指令的下一条指令有两种情况,那么一旦预期的指令不是需要执行的语句,那么cpu需要flush后面几条指令的预处理内容,甚至可能发生CPU缓存的miss,这样就可能白白浪费几个处理器周期甚至更长的时间。
如果我们在写一个分支语句之前就知道这个条件在大多数情况下的结果是TRUE,那么就可以告诉编译器,默认执行路径是走if,就是使用if(likely( )){};否则,就告诉编译器,默认执行路径是else。这样,大多数情况下,处理器的默认执行路径是正确的,提升了处理器的分支预测正确率,减少了处理器flush次数和缓存miss次数。可以大幅提高处理器效率。





  评论这张
 
阅读(60)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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