分支声明likely()/unlikely()

来源:互联网 发布:pmc怎么编程 编辑:程序博客网 时间:2024/06/03 18:38

分支声明likely()/unlikely()

    对于条件语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支进行优化。内核把这条指令封装成了宏,比如likely()和unlikely(),这样使用起来比较方便。

    例如,下面是一个条件选择语句:
    if (error) {
        /* ... */        
    }

    如果想把这个选择标记成绝少发生的分支:
    /* 我们认为error绝大多数情况下都会为0 */
    if (unlikely(error)) {
        /* ... */
    }

    相反,如果我们想把一个分支标记为通常为真的分支:
    /* 我们认为success通常都不会为0 */
    if (likely(success)) {
        /* ... */    
    }        
    

    在你想要对某个条件选择语句进行优化之前,一定要搞清楚其中是不是存在这么一个条件,在绝大多数情况下都会成立。这点十分重要;如果你的判断正确,确实是这个条件占压倒性的地位,那么性能会得到提升;如果你搞错了,性能反而会下降。正如上面这些例子所示,通常在对一些错误条件进行判断的时候会用到unlikely()和likely()。你可以猜到,unlikely()在内核中会得到更广泛的使用,因为if语句往往判断的是一种特殊情况。


特此声明,以上内容摘自《linux内核设计与实现》第三版

0 0
原创粉丝点击