编译器优化 cpu 执行效率
一、计算机特点:
1、cpu流水线,以提前取多条指令进行并行处理
2、到跳转时,则需要重新取指令,打乱了CPU流水线,
3、跳转次数少的程序拥有更高的执行效率
二、__builtin_expect特点:
优点
1、提供分支预测信息,把“很有可能发生”的条件分支放在顺序执行指令段,编译器进行汇编代码代码优化
缺点:
1、造成了代码冗余
三、示例解析
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
int main(char *argv[], int argc)
{
int a = atoi (argv[1]);
if (unlikely (a == 2))
a++;
else
a--;
printf ("%d\n", a);
return 0;
}
1、这里if中判断的条件是a == 2,但是用unlikely括号起来,表示a!=2的情况更可能发生,即a++不太可能被执行,则编译时会把a++的汇编代码放到return 0后面,而a–就放在汇编指令cmp之后,以确保其顺序执行,节省了跳转指令的时间
2、引入__builtin_expect函数来增加条件分支预测的准确性,cpu 会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分支的指令。编译器会产生相应的代码来优化 cpu 执行效率