likely, unlikely的作用
在项目中看到了likely、unlikely宏的使用, 一直不是非常清楚它们的作用,所以就深究下。
likely表示被測试的表达式大多数情况下为true, unlikely则表示相反。
两个宏定义:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
这两个宏常常在条件转移的语句中使用,如if, else if等,这些语句生成的汇编代码都带有jmp指令.
- CPU流水线的一些基本知识.
- CPU流水线设计将一条指令的运行分成了好几个阶段,每一个阶段都是独立的逻辑电路。并且每一个阶段都有自己的阶段寄存器,所以各个阶段就能够实现真正的并行运行。
这里借用下CSAPP上的插图:
这里每条指令被分成了3个阶段, 指令I1的A阶段运行完成后。指令I2进入了A阶段运行,而指令I1则进入B阶段运行。I1的B阶段和I2的A阶段是并行运行的。 - jmp指令对流水线带来的影响
- 由于jmp指令的运行会导致CPU跳转到还有一个内存地址,运行全新的指令,导致流水线里面的指令失效。所以CPU须要flush掉流水线上的寄存器。这样的操作须要几个cycle来恢复流水线的运行. 这样的影响被称之为hazard, 详细能够參考hazard Wiki
- likely,unlikely带来的优化
-
依据gcc手冊, 所以这两个宏是用来告诉编译器分支的可能走向,从而帮助CPU进行分支预測来增强CPU流水线性能的.
看下以下的代码
int main (char *argv[], int argc) {
int v; v = atoi(argv[1]); if (likely(a == 5))
a++;
else
a--; printf("%d\n", a); return 0;
}
编译。带上-O2选项,得到的汇编代码:
0000000000400510 <main>:
400510: 48 83 ec 08 sub $0x8,%rsp
400514: 48 8b 7f 08 mov 0x8(%rdi),%rdi
400518: 31 c0 xor %eax,%eax
40051a: e8 f1 fe ff ff callq 400410 <atoi@plt>
40051f: 83 f8 02 cmp $0x2,%eax
400522: 75 18 jne 40053c <main+0x2c> /* likely在这里表示a非常有可能是2, 所以将运行a++和printf调用放在一起, 免去了jmp带来的影响 */
400524: be 03 00 00 00 mov $0x3,%esi
400529: bf 48 06 40 00 mov $0x400648,%edi
40052e: 31 c0 xor %eax,%eax
400530: e8 bb fe ff ff callq 4003f0 <printf@plt>
400535: 31 c0 xor %eax,%eax
400537: 48 83 c4 08 add $0x8,%rsp
40053b: c3 retq
40053c: 8d 70 ff lea -0x1(%rax),%esi
40053f: eb e8 jmp 400529 <main+0x19> /* jump到调用printf代码处, 导致cpu flush掉流水线上的内容. */
400541: 90 nop
- 适用场景
- gcc手冊表示这两条指令应该在程序猿对分支走向相当确定的情况下使用。只是大多数程序猿还是会预測失败,所以建议经过大量profiling来确定可能性。
在linux内核代码中likely和unlikely常常被用在错误代码处理的情况, 由于发生错误的情况往往是少数的。
likely, unlikely的作用的更多相关文章
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- (转载)linux下各个文件夹的作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
- github中的watch、star、fork的作用
[转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...
- web.xml中welcome-file-list的作用
今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> & ...
- web.xml中load-on-startup的作用
如下一段配置,熟悉DWR的再熟悉不过了:<servlet> <servlet-name>dwr-invoker</servlet-name> <ser ...
- SQLSERVER中NULL位图的作用
SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...
- 电容与EMC-电容不同功能时对整板EMC的作用
一般我们的pcb板的器件有很多种类,但是值得特别关注的,很多人都会说是BGA.接口.IC.晶振之类,因为这些都是layout功能模块以及设计难点.然而数量上占绝对优势的器件却是阻容器件,之前围殴阻抗时 ...
- FTP的搭建与虚拟目录作用<之简单讲解>
操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...
- 火狐浏览器中event不起作用解决办法--记录(一)
今天遇到了这个问题.IE,谷歌下都没问题,但在FF下却不起作用,很郁闷查了半天,看别人博文写了老长,结果试了要么起作用,但太麻烦,要么不起作用,说了那么多跟没说一样. 其实只要这一句代码就行:e=ar ...
- scheduleInRunLoop作用
例子一: - (void)setUpStreamForFile:(NSString *)path { // iStream is NSInputStream instance variable iSt ...
随机推荐
- XML案例(使用DOM4J解析XML文档)
1.Demo1.java package cn.itcast.dom4j; import java.io.File;import java.io.FileOutputStream;import jav ...
- Java压缩技术(一) ZLib
原文:http://snowolf.iteye.com/blog/465433 有关ZLib可参见官方主页 http://www.zlib.net/ ZLib可以简单的理解为压缩/解压缩算法,它与ZI ...
- 企业级分布式监控系统--zabbix
目录 1.Zabbix简介 2.zabbix安装 3.工作原理 4.监控功能 5.监控系统架构 6.Zabbix系统架构 7.Zabbix组件构成 8.zabbix监控环境中基本概念 正文 回到顶部 ...
- POJ 1236 Tarjan算法
这道题认真想了想.. [ 题目大意:有N个学校,从每个学校都能从一个单向网络到另外一个学校,两个问题 1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 2:至少需要添加几条 ...
- HTML <!DOCTYPE>标签
一般一个基本html页面的结构,如下代码所示: <html> <head> <title>我是基本的页面结构</title> </head> ...
- 消除svn选定(checkout)桌面上文件显示一大堆问号。
图片: 解决方法一: 桌面右键选择TortoiseSVN——>点击Settings,如下图,选中Icon Overlays(图标覆盖),去勾选Fixed drives(本地磁盘),点击确定,按F ...
- xml之基本操作
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...
- jQuery考试之错题分析
获取元素范围大小顺序依次为: $(#one).siblings("div")>$("#one~div")>$("#one +div&quo ...
- RabbitMQ 官方NET教程(四)【路由选择】
在上一个教程中,我们构建了一个简单的日志记录系统. 我们能够广播日志消息给所有你的接收者. 在本教程中,我们将为其添加一个功能 - 我们将让日志接收者可以仅订阅一部分消息. 例如,我们将能够仅将关键的 ...
- [原创]Linux(CentOS)下安装mongodb
和上一篇一样,装个这个踩了无数个坑…… 1.下载 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel55-3.2.12.tgz ...