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

Linux 3.12代号Suicidal Squirrel

怎样在 Ubuntu 上安装 Linux 3.11 内核

Ubuntu 13.10 (Saucy Salamander) 内核已升级至 Linux Kernel 3.10 RC5

Linux Kernel 3.4.62 LTS 现已经提供下载

如何在Ubuntu 13.10上安装Linux内核 3.12

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/eafa5e4801f1656150a0c36930c1f647.html