zoukankan      html  css  js  c++  java
  • 【转载】likely和unlikely

    ZZ: http://gpg119.blog.163.com/blog/static/9153415320088176193165/

    linux中判断语句经常会看到likely和unlikely,例如:

    if(likely(value)){

    }

    else{

    }

    简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)。

    也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意识是value的值为真的可能

    性更大一些,那么执行if的机会大,而unlikely表示value的值为假的可能性大一些,执行else机会大一些。

    加上这种修饰,编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后

    面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度,likely和unlikely的实现在

    include/linux/compiler.h中:

          9 #if __GNUC__ == 2 && __GNUC_MINOR__ < 96
         10 #define __builtin_expect(x, expected_value) (x)
         11 #endif
         12
         13 #define likely(x)   __builtin_expect((x),1)
         14 #define unlikely(x) __builtin_expect((x),0)

    __builtin_expect是gcc的一个预处理命令,其解释如下:

    long __builtin_expect (long exp, long c)
    You may use __builtin_expect to provide the compiler with branch prediction
    information. In general, you should prefer to use actual profile feedback for this

    (‘-fprofile-arcs’), as programmers are notoriously bad at predicting how their
    programs actually perform. However, there are applications in which this data is
    hard to collect.
    The return value is the value of exp, which should be an integral expression. The
    value of c must be a compile-time constant. The semantics of the built-in are that it
    is expected that exp == c. For example:
    if (__builtin_expect (x, 0))
    foo ();
    would indicate that we do not expect to call foo, since we expect x to be zero. Since
    you are limited to integral expressions for exp, you should use constructions such as
    if (__builtin_expect (ptr != NULL, 1))
    error ();
    when testing pointer or floating-point values.

  • 相关阅读:
    作业四:结对编程项目---四则运算
    作业三: 代码规范、代码复审、PSP
    自动生成四则运算题目
    源程序版本管理软件和项目管理软件的优缺点
    学习进度表
    第一周随笔
    对之前问题的回答
    结对编程——四则运算
    PSP
    代码复审
  • 原文地址:https://www.cnblogs.com/hengfeng/p/2313464.html
Copyright © 2011-2022 走看看