1.builtin_expect-分支预测优化
1.1介绍
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
1.2函数声明
long __builtin_expect(long exp, long c);
exp 为一个整型表达式, 例如: (ptr != NULL),c 必须是一个编译期常量, 不能使用变量。
返回值等于第一个参数exp;与c的值无关。
1.3使用方法
//a == 2 的可能性小,所以执行do something()的可能性大;
if(unlikely(a == 2))
{
func();
}
else
{
//do something();
}
1.4原理
if else 句型编译后, 一个分支的汇编代码紧随前面的代码,而另一个分支的汇编代码需要使用JMP指令才能访问到。很明显通过JMP访问需要更多的时间, 在复杂的程序中,有很多的if else句型,又或者是一个有if else句型的库函数,每秒钟被调用几万次,通常程序员在分支预测方面做得很糟糕,,编译器又不能精准的预测每一个分支,这时JMP产生的时间浪费就会很大,函数__builtin_expect()就是用来解决这个问题的。
!!的作用是吧x的值进行两次非运算,转化为0,或1;