`
xidajiancun
  • 浏览: 455991 次
文章分类
社区版块
存档分类
最新评论

GCC——分支预测(likely和unlikey)

 
阅读更多

最近在拜读一个项目源代码的过程中,发现了一个有意思的GCC特性,现将这个特性总结如下:

开发人员在开发服务的过程中,可以根据业务逻辑的特性来判断当前的条件语句被执行的概率情况,经常被执行到的代码片段可以紧邻顺序执行的代码片段后边,偶尔被执行到的条件代码片段被放到其他代码片段,从而减少代码在顺序执行过程中的代码上下文的跳转次数,达到提高程序执行效率的目的。这种方式的优化,需要严重的依赖于业务逻辑所处的环境,对于GCC等编译器来将,显然是无法根据业务逻辑自动做出性能优化的,最直接的一种方法就是:由开发人员告诉编译器,这部分代码片段被执行的概率比较高,可以进行优化。为此,诞生了两个针对进行这种优化的宏定义,分别是:likely和unlikeyly,经常被用于的使用场景为:

if (likely(value)){

//do thing1

}else{

//do thing2

}

if (unlikely(value)){

//do thing1

}else{

// do thing2

}


其实,无论是if(likely(value))还是if(unlikely(value)),从代码阅读的角度与if(value)是完全一样的,区别点在于编译器根据三种情况所作出的优化措施不同;

likely,是通知编译器if (true)被执行的概率比较高;

unlikely,是通知编译器if(false)被执行的概率比较高;

继续刨根问底的翻查这两个宏的实现:

#define likely(x) __builtin_expect(!!(x), 1)

#define unlikely(x) __builtin_expect(!!(x), 0)

本质上是通过__builtin_expect函数来通知编译器如何来进行优化

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics