您的位置:首页 > 运维架构 > Linux

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的内置函数:可以看文档对其介绍.

   简单的意思就是对于long __builtin_expect (long exp, long c)原型
参数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 likely unlikel