开发人员在开发服务的过程中,可以根据业务逻辑的特性来判断当前的条件语句被执行的概率情况,经常被执行到的代码片段可以紧邻顺序执行的代码片段后边,偶尔被执行到的条件代码片段被放到其他代码片段,从而减少代码在顺序执行过程中的代码上下文的跳转次数,达到提高程序执行效率的目的。这种方式的优化,需要严重的依赖于业务逻辑所处的环境,对于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函数来通知编译器如何来进行优化