_builtin_expect-分支预测优化

__builtin_expect是一个用于优化分支预测的C语言内建函数。它允许程序员指定预期的分支执行路径,从而帮助编译器更好地安排代码以减少JMP指令带来的性能开销。在if-else结构中,通过unlikely和likely宏来标记预期不太可能发生或更可能发生的条件,提升程序运行效率。这种方法在处理高频率调用的函数或复杂控制流时尤其有用。
摘要由CSDN通过智能技术生成

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值