CPU流水线:

CPU的工作也可以大致分为指令的获取、解码、运算和结果的写入四个步骤,
如果不采用流水线工作方式,依次进行工作,后面的部件等待前面的部件工作的完成,
当一部分工作的时候,其余的三部分会空闲,这是对资源的极大的浪费
直接影响到CPU的工作效率

define likely(x) __builtin_expect(!!(x), 1)

define unlikely(x) __builtin_expect(!!(x), 0)

likely(x)宏传入__builtin_expect(!!(x), 0)的第一个参数为!!x,这样写是因为__builtin_expect的第一个参数需要为long型,而我们如果想传入指针或字符串类型,则需要使用!!x将x变成long型,例如,如果一个指针ptr==NULL,则!ptr=1,而!!ptr=0。

这个函数无论在linux内核还是在一些系统开发中经常看到,实际上是用来做分支预测的,分支预测的意义如下:

CPU的流水线的工作模式,决定在执行一条指令时顺便会把接下来要执行的指令读取当执行到if这样的分支的时候,决定是取if下面的指令,还是其他分支的指令我们取出被执行可能性最大的那个分支的指令序列,这样就可以提升执行的效率;
反之,如果预测不准确,那么提前被读取的指令就没有意义,需要重新读取其他分支的指令。

类似于这样的代码:

if( likely(expr) )
{//将这部分代码编译到前面,利于CPU取指
}
else
{
}
一般认为表达式expr在绝大多数情况下是成立的if(unlikely(expr))
{
}
else
{//将这部分代码编译到前面,利于CPU取指
}
一般认为表达式expr在绝大多数情况下是不成立的

#define likely(x) __builtin_expect(!!(x), 1)也就是说明x==1是“经常发生的”或是“很可能发生的”。
使用likely ,执行if后面语句的可能性大些,编译器将if{}中的内容编译到前面,

使用unlikely ,执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。

总结:
likely与unlikely互换或不用都不会影响程序的正确性,但可能会影响程序的效率。
参考链接:
https://blog.csdn.net/jasonchen_gbd/article/details/44968395
https://blog.csdn.net/tommy_wxie/article/details/7384641

最新文章

  1. CVPR 2020 Oral | 人脸识别Loss新突破: 旷视提出Circle Loss,革新深度特征学习范式...
  2. JZ2440学习总结3
  3. spring框架做全局异常捕获_@ControllerAdvice注解(全局异常捕获)
  4. mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导
  5. uni-app 2.2 发布,大幅度优化 H5 端性能体验 | 技术头条
  6. 论文笔记:语音情感识别(二)声谱图+CRNN
  7. Python入门经典(2K超清)
  8. 微信小程序 获取cookie 以及设置 cookie
  9. 理解 loss function : binary cross entropy
  10. PLC数据采集解决方案及数采网关
  11. mysql5.5忘记密码重置方法_mysql5.5忘记密码重置方法
  12. 数位板软件测试工资,一位强迫症患者对板子的深度剖析,绘王H950P数位板测评...
  13. AUTOCAD——中心线绘制、CAD默认线宽是多少?可以修改吗?
  14. 【全局规划】人工势场法(APF)
  15. 心田花开小学一年级阅读试题
  16. 和风天气API接口获取天气数据 android端
  17. Matlab 中一些符号的含义
  18. 【HBase】关于包org.apache.hadoop.hbase.client
  19. 伏拉夫背景音乐计算机版,SONOS ZonePlayer 120
  20. 品牌如何利用受众心理打造节日宣传方案?

热门文章

  1. 益智乐园——DuerOS的又一盈利之路
  2. Java基础_集合_List与Set集合(笔记)
  3. matlab怎么调用filter函数,如何在matlab中建立和调用filter函数
  4. 用zrender制作一个基础的绘图板,绘图板可用于组态界面的基础性开发
  5. AI vs ML:有什么区别?
  6. x264源码分析与应用示例(一)——视频编码基本流程
  7. eversync safari_EverSync app下载-浏览器书签收藏夹同步备份EverSync下载v1.11.1 安卓版-西西软件下载...
  8. FlexPaper+SWFTools 实现仿百度文库及一些小问题
  9. Topk实现(C++)
  10. 使用VM安装安卓虚拟机