Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235649
  • 博文数量: 51
  • 博客积分: 1065
  • 博客等级: 少尉
  • 技术积分: 556
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-11 14:50
文章分类

全部博文(51)

文章存档

2012年(1)

2011年(6)

2010年(39)

2008年(1)

2007年(4)

分类:

2010-03-12 11:59:40

其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。 
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化,例如:

    if (ts->model == 7843) {
        Rt = ts->pressure_max / 2;
    } else if (likely(x && z1)) {
        /* compute touch pressure resistance using equation #2 */
        Rt = z2;
        Rt -= z1;
        Rt *= x;
        Rt *= ts->x_plate_ohms;
        Rt /= z1;
        Rt = (Rt + 2047) >> 12;
    } else {
        Rt = 0;
    }

这两个宏在内核中定义如下:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

__builtin_expect() 是 GCC (version >= 2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。

__builtin_expect((x),1) 表示 x 的值为真的可能性更大;
__builtin_expect((x),0) 表示 x 的值为假的可能性更大。

阅读(3229) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~