GCC __builtin_expect的作用
来源:互联网 发布:怎样利用网络做直销 编辑:程序博客网 时间:2024/05/16 04:56
将流水线引入cpu,可以提高cpu的效率。更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率。如下图所示:
+--------------------------------
|取指令 | 执行指令 | 输出结果
+--------------------------------
| | 取指令 | 执行
+--------------------------------
可见,cpu流水钱可以减少cpu等待取指令的耗时,从而提高cpu的效率。
如果存在跳转指令,那么预先取出的指令就无用了。cpu在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令。cpu只能重新从内存中取出offset偏移处的指令。因此,跳转指令会降低流水线的效率,也就是降低cpu的效率。
综上,在写程序时应该尽量避免跳转语句。那么如何避免跳转语句呢?答案就是使用__builtin_expect。
这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器"。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。一般的使用方法是将__builtin_expect指令封装为LIKELY和UNLIKELY宏。这两个宏的写法如下。
#define LIKELY(x) __builtin_expect(!!(x), 1) //x很可能为真
#define UNLIKELY(x) __builtin_expect(!!(x), 0) //x很可能为假
运行如下命令:
gcc -fprofile-arcs -O2 -c test_builtin_expect.c
objdump -d test_builtin_expect.o
输出的汇编码为:
可见,编译器利用程序员作出的判断,生成了高效的汇编码。即,跳转语句不生效的概率很大。
+--------------------------------
|取指令 | 执行指令 | 输出结果
+--------------------------------
| | 取指令 | 执行
+--------------------------------
可见,cpu流水钱可以减少cpu等待取指令的耗时,从而提高cpu的效率。
如果存在跳转指令,那么预先取出的指令就无用了。cpu在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令。cpu只能重新从内存中取出offset偏移处的指令。因此,跳转指令会降低流水线的效率,也就是降低cpu的效率。
综上,在写程序时应该尽量避免跳转语句。那么如何避免跳转语句呢?答案就是使用__builtin_expect。
这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器"。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。一般的使用方法是将__builtin_expect指令封装为LIKELY和UNLIKELY宏。这两个宏的写法如下。
#define LIKELY(x) __builtin_expect(!!(x), 1) //x很可能为真
#define UNLIKELY(x) __builtin_expect(!!(x), 0) //x很可能为假
如下是一个实际的例子。
运行如下命令:
gcc -fprofile-arcs -O2 -c test_builtin_expect.c
objdump -d test_builtin_expect.o
输出的汇编码为:
可见,编译器利用程序员作出的判断,生成了高效的汇编码。即,跳转语句不生效的概率很大。
参考资料:http://hi.baidu.com/uu_dou/item/e9f6f41d570d817b7a5f25c7
阅读全文
0 0
- GCC __builtin_expect的作用
- GCC __builtin_expect的作用
- GCC __builtin_expect的作用
- GCC __builtin_expect的作用
- gcc的内建函数__builtin_expect
- gcc的内建函数__builtin_expect
- gcc的内建函数__builtin_expect
- gcc的内建函数__builtin_expect
- gcc的内建函数__builtin_expect
- gcc 编译器 , __builtin_expect() 研究
- 将gcc下的程序移植到MSVC下 之三 - __builtin_expect的实现
- likely,unlikely宏与GCC内建函数__builtin_expect()
- likely,unlikely宏与GCC内建函数__builtin_expect()
- likely,unlikely宏与GCC内建函数__builtin_expect()
- like,unlikely宏和GCC内建函数__builtin_expect()
- likely,unlikely宏与GCC内建函数__builtin_expect()
- likely,unlikely宏与GCC内建函数__builtin_expect()
- gcc -D选项的作用
- 黑盒测试方法五(场景法)
- Ubuntu使用Anaconda搭建SimpleITK开发环境
- float类型和double类型的二进制存储 .
- 缓存过期时间
- (3888: [Usaco2015 Jan]Stampede)<离散化+线段树>
- GCC __builtin_expect的作用
- 【脚本语言系列】关于Python网络通讯socket,你需要知道的事
- 从一次需求调研会议看项目经理的能力
- 文件格式判断过滤
- 内核特征码搜索 获取未导出函数
- okHttp封装库
- Maven 使用profile以占位符的形式指定开发、生产等不同的环境
- 在Android手机上运行基于appium的第一个测试案例
- java实现定时任务的三种方法