系统中.../include/linux/compiler.h定义
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
看了其他博客,只说明了这个宏的作用,优化流程,没有说明一点就是:
if(likely(x)) 等价于 if(x)
if(unlikely(x)) 等价于 if(x)
likely或者unlikely都是在X表达式为真时返回1。
优化原理:
现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。
所以就引入了 likely 和 unlikely ,目的是增加条件分支预测的准确性,cpu 会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分 支的指令。unlikely 表示你可以确认该条件是极少发生的,相反 likely 表示该条件多数情况下会发生。编译器会产生相应的代码来优化 cpu 执行效率。
也就是说,使用 likely() ,执行 if 后面的语句 的机会更大,使用 unlikely(),执行 else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。
应用场景:
表达式为假的可能性大,用unlikely
int main()
{
int x = 2;
if (unlike(x < 1))
{
printf("此分支执行的可能性极小\n");
}
else
{
printf("cpu提前获取else分支\n");
}
return 0;
}
表达式为真的可能性大,用unlikely
int main()
{
int x = 0;
if (unlike(x < 1))
{
printf("cpu提前获取if分支\n");
}
else
{
printf("此分支执行的可能性极小\n");
}
return 0;
}
分析:个人觉得likely、unlikely有一个就可以,如果表达式可能为假(x<2),如果不想使用unlikely,直接表达式取反,likely(x>=2)就可以了