Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1595970
  • 博文数量: 92
  • 博客积分: 2002
  • 博客等级: 大尉
  • 技术积分: 4717
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:09
文章分类

全部博文(92)

文章存档

2013年(1)

2012年(6)

2011年(85)

分类: LINUX

2011-01-18 09:33:31


likely() 和 unlikely()两个宏定义在linux-2.6.24/include/linux/compiler.h (别的版本没看过)

  1. #define likely(x)   __builtin_expect(!!(x), 1)
  2. #define unlikely(x) __builtin_expect(!!(x), 0)

__builtin_expect是gcc中提供的一个预处理命令,用于代码优化。gcc(version 4.4.0)具体定义如下:

long __builtin_expect (long exp, long c) [Built-in Function]

注解为:
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 semantics of the built-in are that it is expected that exp == c.

#define likely(x) __builtin_expect(!!(x), 1)
说明 x==1 是“很可能发生的”。这里的!!(x)是用来获取布尔值的。x若是6, !(x)为0  !!(x)就为1

使用likely(),执行if后面语句的可能性大些,编译器将if{}是的内容编译到前面,
使用unlikely(),执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。
这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。likely与unlikely互换或不用都不会影响程序的正确性。但可能会影响程序的效率。


内核代码举例:文件 linux-2.6.24/drivers/ata/libata-core.c

  1. if (unlikely(ata_rwcmd_protocol(tf, dev) < 0))
  2.             return -EINVAL;


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