linux likely & unlikely 宏
2015-09-10 20:58
483 查看
一 简介
在内核代码中可以看到用到likely 跟 unlikely的宏代码有很多处,这2个宏的目的主要是提高执行速度,在一些对性能要求比较高,而且预定性比较高(大部分情况下你预定的结果跟实际跑的结果是一致的)的场合可以结合if语句使用.二 实现
宏定义位于include/compiler.h文件中,如下# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
先看参数,这里用了2个取反操作!!,目的是为了确保参数被正常转换为bool型的数值(自己可以编写测试一下).
再看__builtin_expect,这是GCC的内置函数:可以看文档对其介绍.
参数exp为任一表达式,c必须为常量值,其意义是在exp==c时,该函数返回非0值,意即希望exp==c。
回到likely和unlikely,likely实际是希望表达式x==1,即表达式x成立,并且在代码实际执行中,表达式x在绝大多数情况下是成立的,相反,unlikely是希望表达式在绝大多数情况下不成立,
那他是如何优化的呢?这段代码如下:
if (likely(a == 2)) a++; else a--;
用这个GCC内置函数编译出来的汇编代码 a++这个操作会紧跟判断语句的后面,这样cpu的预取指令流水线就把其弄到cache,比从内存读速度快多了,另外指令跳转会带来性能下降。
三 应用
这对宏的用法跟普通的if语句一样用行了,但是这对宏是不是可以无现限制无条件的使用?我们来看看外国友人的回答.You should use it only in cases when the likeliest branch is very very very likely, or when the unlikeliest branch is very very very unlikely.
相关文章推荐
- Linux socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量
- Linux下修改MySQL编码的方法