Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux内核中的likely()和unlikely()宏

在Linux内核代码中经常看到likely()和unlikely()这两个宏,其定义如下:# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)其中__builtin_expect()函数是gcc提供的用于对分支语句进行优化,其原型如下:long __builtin_expect (long exp, long c)当exp == c时,该函数返回非零值;gcc内建这个函数用于条件选择语句的优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以对条件分支选择进行优化;likely(x)即表示x很可能或者绝大多数情况下为真;而unlikely则刚好相反。(宏定义中的!!(x),对x两次取反,只是确保将x转化成bool型)如对下面的条件选择语句:if (error) {
    ......
}如果想把这个标记成绝少发生的分支,即认为error绝大多数情况下都为0:if (unlikely(error)) {
    ......
}相反,如果认为某个分支发生的可能性很大:if (likely(success)) {
    ......
}即认为success在绝大多数情况下为真。在对某个条件选择语句进行优化之前,一定要搞清楚其中是不是存在这么一个条件,在绝大多数情况下都会成立;如果判断正确,那么性能会提高,否则将会产生相反的效果。(编译器在碰到需要优化的条件分支时,会将可能性大的分支编译到前面来,这样有利于CPU的预取,提高预取指令的正确率,从而提高性能)Linux Kernel 的详细介绍:请点这里
Linux Kernel 的下载地址:请点这里相关阅读:Linux内核将用nftables替代iptables http://www.linuxidc.com/Linux/2013-10/91727.htmLinux 3.12代号Suicidal Squirrel http://www.linuxidc.com/Linux/2013-09/90023.htm怎样在 Ubuntu 上安装 Linux 3.11 内核 http://www.linuxidc.com/Linux/2013-09/89674.htmUbuntu 13.10 (Saucy Salamander) 内核已升级至 Linux Kernel 3.10 RC5 http://www.linuxidc.com/Linux/2013-06/86110.htmLinux Kernel 3.4.62 LTS 现已经提供下载 http://www.linuxidc.com/Linux/2013-09/90368.htm如何在Ubuntu 13.10上安装Linux内核 3.12 http://www.linuxidc.com/Linux/2013-11/92930.htm