当前位置: 首页 > 工具软件 > Likely > 使用案例 >

GCC中的分支预测(likely和unlikey)

乐正穆冉
2023-12-01

概述

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

场景

if (likely(value)){undefined

//do thing1

}else{undefined

//do thing2

}

if (unlikely(value)){undefined

//do thing1

}else{undefined

// 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函数来通知编译器如何来进行优化

 类似资料: