__builtin_expect作用

文章目录

  • __builtin_expect作用
    • 引言
    • cyberRT中对__builtin_expect的封装
    • __builtin_expect作用

引言

最近在看cyberRT代码中,发现在协程croutine中频繁使用cyber_likely和cyber_unlikely,看了下这两个都是对__builtin_expect的封装,那__builtin_expect具体是什么作用?

cyberRT中对__builtin_expect的封装

#if __GNUC__ >= 3
#define cyber_likely(x) (__builtin_expect((x), 1))
#define cyber_unlikely(x) (__builtin_expect((x), 0))
#else
#define cyber_likely(x) (x)
#define cyber_unlikely(x) (x)
#endif

__builtin_expect作用

__builtin_expect() 是 GCC (version >= 2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。

__builtin_expect((x),1)  // 表示 x 的值为真的可能性更大;
__builtin_expect((x),0)  // 表示 x 的值为假的可能性更大。

也就是说,使用likely(),执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。

现代 CPU 内部,都有 cache 这个缓存器件。CPU 的运行速度很高,而外部 RAM 的速度相对来说就低了不少,所以当 CPU 从内存 RAM 读写数据时就会有一定的性能瓶颈。为了提高程序执行效率,CPU 都会通过 cache 这个 CPU 内部缓冲区来缓存一定的指令或数据。CPU 读写内存 RAM 中的数据时,会先到 cache 里面去看看能不能找到。找到的话就直接进行读写;找不到的话,cache 会重新缓存一部分内存数据进来。CPU 读写 cache 的速度远远大于内存 RAM,所以通过这种方式,可以提高系统的性能。

那 cache 如何缓存内存数据呢?简单来说,就是依据空间相近原则。比如 CPU 正在执行一条指令,那么下一个指令周期,CPU 就会大概率执行当前指令的下一条指令。如果此时 cache 将下面几条指令都缓存到 cache 里面,下一个指令周期 CPU 就可以直接到 cache 里取指、翻译、执行,从而使运算效率大大提高。

但有时候也会出现意外。比如程序在执行过程中遇到函数调用、if 分支、goto 跳转等程序结构,会跳到其它地址执行,那么缓存到 cache 中的指令就不是 CPU 要获取的指令。此时,我们就说 cache 没有命中,cache 会重新缓存正确的指令代码给 CPU 读取,这就是 cache 工作的基本流程。

有了这个理论基础,我们在编写程序时,遇到 if/switch 这种选择分支的程序结构,可以将大概率发生的分支写在前面,这样程序运行时,因为大概率发生,所以大部分时间就不需要跳转,程序就相当于一个顺序结构,从而提高 cache 的命中率。内核中已经实现一些相关的宏,如 likely 和 unlikely,用来提醒程序员优化程序。

__builtin_expect作用相关推荐

  1. __builtin_expect用法

    __builtin_expect说明 GCC提供了一系列builtin函数,下面对__builtin_expect(EXP, N)函数进行说明. __builtin_expect(EXP, N)说明 ...

  2. __builtin_expect的作用

    将流水线引入cpu,可以提高cpu的效率.更简单的说,让cpu可以预先取出下一条指令,减少cpu等待取指令的耗时,从而可以提供cpu的效率. 如果存在跳转指令,那么预先取出的指令就无用了.cpu在执行 ...

  3. __builtin_expect详解

    在GTK+2.0源码中有很多这样的宏:G_LIKELY和G_UNLIKELY.比如下面这段代码: if (G_LIKELY (acat == 1)) /* allocate through magaz ...

  4. __builtin_expect提高运行效率

    这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器".这个指令的写法为:__builtin_expect(EXP, N).意思是:EXP==N的概率很大. 给 ...

  5. unlikely 与 likely的作用

    unlikely与likely在linux kernel中经常出现. 函数定义: # define likely(x) __builtin_expect(!!(x), 1) # define unli ...

  6. 分支预测优化之__builtin_expect

    1.引言 在很多源码如Linux内核.Glib等,我们都能看到likely()和unlikely()这两个宏,通常这两个宏定义是下面这样的形式. #define likely(x) __builtin ...

  7. 《C语言杂记》编译优化之__builtin_expect

    最近在研究压缩算法的时候,看到了以下代码: #define LIKELY(c) (__builtin_expect(!!(c), 1)) #define UNLIKELY(c) (__builtin_ ...

  8. likely(x)与unlikely(x)函数,即__builtin_expect的使用

    目录 1.引言 2. 函数声明 2.1. 功能描述 2.2. 参数详解 ① exp  ② c 2.3. 返回值 2.4. 使用方法 3. RATIONALE(原理) 4. likely()和unlik ...

  9. unlikely和likely函数作用

    在linux内核中的判断语句里常见到unlikely和likely函数. 如: if(unlikely(a)) // if(likely(a)) {... } else {... } 两函数实质是__ ...

最新文章

  1. python各种模块的使用
  2. 7-26复习重载并实现重载部分符号
  3. 初次尝试HTML,用记事本编写代码并以html格式保存后用Google浏览器打开
  4. 本地方法(JNI)——使用调用API
  5. 电脑的发展史_互联网发展史 硅谷传奇之 IBM
  6. 两个多项式相乘求解系数数组算法
  7. 向服务器写入错误日志-log
  8. 你不知道的思维导图能做的事
  9. 图片识别不了小程序怎么办_【信息素养】教你怎么用微信小程序进行文字识别...
  10. Nsight Visual Studio Edition初学使用方法
  11. 受力分析软件_大赛作品 | 关于Z型路灯受力情况分析
  12. sublime text 3211 安装中文包
  13. 计算机网络 --- IP地址的详细分类
  14. 【2023秋招】10月8日美团校招两道题
  15. Python3 matplotlib 将图片转华为png格式图片数据
  16. 转换为ico格式图片
  17. 人月神话(12)干将莫邪
  18. python词云生成与设计实现_python简单词云生成
  19. 感觉本人对事待人处理不当。
  20. 精读《X3D: Expanding Architectures for Efficient Video Recognition》论文

热门文章

  1. 如何利用大数据构建用户画像?
  2. 3.3.3JavaScript网页编程——WebAPI(JS之BOM含正则)
  3. glup自动化构建工具
  4. XnView 1.97.0
  5. 天津理工大学计算机调剂信息,天津理工大学2020考研调剂信息发布
  6. ​力扣解法汇总1984-学生分数的最小差值
  7. 大连地铁首次穿海 地铁5号线开始黄海隧道作业
  8. ResultType和ResultMap的区别
  9. odoo 快速处理主从表关系 (6,0,[IDS])实例
  10. 解神者x2服务器维护,解神者X2服务器维护中? 登不上与连网失败解决攻略