Linux代码中的unlikely和likely分别是什么意思?

古月书斋 2007-03-08 09:26:43
Linux代码中的unlikely和likely分别是什么意思?
我在Linux代码中没有找unlikely和likely的定义.
在源代码中搜索出来很多无法找.
请各位赐教!
谢谢!
...全文
2517 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangdongfang 2008-08-19
  • 打赏
  • 举报
回复
现学现卖。。呵呵。。

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

likely是一个宏, __builtin_expect 才是gcc 扩展。
lauxp 2007-03-17
  • 打赏
  • 举报
回复
ls正解,内核的模块很多都是这样的,比如内核地址空间地址fixup,
.section .fixup
.previous

不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。
joyself 2007-03-11
  • 打赏
  • 举报
回复
下面节自《Linux Kernel Development》 2nd , 第二章
(书可以在http://elinux.cn下载)

Branch Annotation
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().

For example, consider an if statement such as the following:

if (foo) {
/* ... */
}



To mark this branch as very unlikely taken (that is, likely not taken):

/* we predict foo is nearly always zero ... */
if (unlikely(foo)) {
/* ... */
}



Conversely, to mark a branch as very likely taken:

/* we predict foo is nearly always nonzero ... */
if (likely(foo)) {
/* ... */
}



You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.

yqzq 2007-03-09
  • 打赏
  • 举报
回复
内核里有很多线程的代码啊
其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化
古月书斋 2007-03-09
  • 打赏
  • 举报
回复
指令优化的东西
控制CPU的指令预取
?
怎么优化呀?举个例好吗?
THX
lmxctds 2007-03-09
  • 打赏
  • 举报
回复
是GCC对C的扩展,unlikely和likely分别表示一个表达式不太可能为真或很可能为真,这样编译器能够更好的优化指令预取,提高运行效率。
例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。
yqzq 2007-03-08
  • 打赏
  • 举报
回复
指令优化的东西
控制CPU的指令预取

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧