在内核代码中时常 会看到 unlikely 和 likely 的踪影。他们实际上是解释在 linux/compiler.h 中的两个宏:
- #define likely(x) __builtin_expect(!!(x), 1)
-
#define unlikely(x) __builtin_expect(!!(x), 0)
这里的 __built_expect() 函数是 gcc 的内建函数。
至于为什么要在内核代码中运用这两个宏,首要的目标是为了实行代码的优化,提高系统执行速度。
比如 :
- if (likely(a>b)) {
-
fun1();
-
}
-
if (unlikely(a<b))
-
fun2();
这里就是程序员可以确定 a>b 在程序执行流程中出现的可能相比较大,因此运用了 likely() 告诉编译器将 fun1() 函数的二进制代码紧跟在前面程序的后面,这样就 cache 在预取数据时就可以将 fun1() 函数的二进制代码拿到 cache 中。这样,也就添加了 cache 的命中率。
同样的,unlikely() 的作用就是告诉编译器,a
咱们不用对 likely 和 unlikely 感到迷惑,须要知晓的就是 if(likely(a>b)) 和 if(a>b) 在功能上是等价的,同样 if(unlikely(a
比如下面的代码:
- #include <stdio.h>
-
#define unlikely(x) __builtin_exp ect(!!(x), 0)
-
#define likely(x) __builtin_exp ect(!!(x), 1)
-
-
int main()
-
{
-
int a=2,b=4;
-
if(unlikely(a<b)) {
-
printf("in the unlikely,is not your exp ecting!\n");
-
} else {
-
printf("in the unlikely, is your exp ecting\n");
-
}
-
if(likely(a<b)) {
-
printf("in the likely, is your exp ecting\n");
-
}
-
return 0;
-
}
执行结果:
- in the unlikely,is not your exp
-
in the likely, is your exp ecting
总之,likely 和 unlikely 的功能就是添加 cache 的命中率,提高系统执行速度。
阅读(690) | 评论(0) | 转发(0) |