现在的位置: 首页 > 综合 > 正文

详解likely和unlikely函数

2018年04月11日 ⁄ 综合 ⁄ 共 2181字 ⁄ 字号 评论关闭

内核源码:linux-2.6.38.8.tar.bz2

    参考文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Other-Builtins.html#Other-Builtins

 

     在Linux内核中likely和unlikely函数有两种(只能两者选一)实现方式,它们的实现原理稍有不同,但作用是相同的,下面将结合linux-2.6.38.8版本的内核代码来进行讲解。

    1、对__builtin_expect的封装

    它们的源代码如下: 

    __builtin_expect 是GCC的内置函数,用来对选择语句的判断条件进行优化,常用于一个判断条件经常成立(如likely)或经常不成立(如unlikely)的情况。

    __builtin_expect的函数原型为long  __builtin_expect (long exp, long c),返回值为完整表达式exp的值,它的作用是期望表达式exp的值等于c(注意,如果exp == c条件成立的机会占绝大多数,那么性能将会得到提升,否则性能反而会下降)。

    在普通的应用程序中也可以使用__builtin_expect,如下面的例子: 

    分别输入整数0到4来进行5次测试,它们的输出分别为: 

    注意,在上例中只有输入整数0的时候才执行else后的打印语句,也就是说__builtin_expect(a, 4)函数的值就是表达式a的值。

    记住,它们只是用来提升性能的优化手段,并不会改变原来表达式的值。

    2、使用__branch_check__函数

    它们的源代码如下: 

    (1)、先使用内置函数__builtin_constant_p忽略表达式x为常量的情况

    __builtin_constant_p也是GCC的内置函数,函数原型为int  __builtin_constant_p(exp),用于判断表达式exp在编译时是否是一个常量,如果是则函数的值为整数1,否则为0,如下面的例子:

    例子的输出结果: 

    例子中的ptr为指针变量,所以__builtin_constant_p(ptr)的值为0,num的值为30。

    (2)、函数__branch_check__的实现 

    使用它来检查判断条件并记录likely判断的预测信息,之后根据预测信息进行相应的优化以提升性能。

    函数__branch_check__的返回值为______r的值,也就是参数x的值。

抱歉!评论已关闭.