c unlikelyy linux 哪个库

Linux(24)
likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?
首先明确:
if (likely(value))等价于if (value)
if (unlikely(value))等价于if (value)
也就是说likely()和unlikely()从阅读和理解的角度是一样的。
这两个宏在内核中定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
这里的__built_expect()函数是gcc(version &= 2.96)的内建函数,提供给程序员使用的,目的是将”分支转移”的信息提供给编译器,这样编译器对代码进行优化,以减少指令跳转带来的性能下降。
__buildin_expect((x), 1)表示x的值为真的可能性更大.
__buildin_expect((x), 0)表示x的值为假的可能性更大.
也就是说,使用likely(),执行if后面的语句的机会更大,使用unlikely(),执行else后面的语句机会更大一些。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着后面的代码,从而减少指令跳转带来的性能上的下降。
if (likely(a&b)) {
  fun1();
if (unlikely(a&b){
  fun2();
  这里就是程序员可以确定 a&b 在程序执行流程中出现的可能相比较大,因此运用了likely()告诉编译器将fun1()函数的二进制代码紧跟在前面程序的后面,这样就使cache在预取数据时就可以将fun1()函数的二进制代码拿到cache中。这样,也就添加了cache的命中率。
  同样的,unlikely()的作用就是告诉编译器,a&b在程序执行流程中出现的可能性较小时执行fun2()。
  咱们不用对likely和unlikely感到迷惑,须要知晓的就是 if(likely(a&b)) 和 if(a&b)在功能上是等价的,同样 if(unlikely(a&b)) 和 if (a&b)在功能上是等价的。
  比如下面的代码:
#include &stdio.h&
#define unlikely(x) __builtin_exp ect(!!(x), 0)
#define likely(x) __builtin_exp ect(!!(x), 1)
int main()
  int a=2,b=4;
  if(unlikely(a&b)) {
  printf("in the unlikely,is not your exp ecting!\n");
  } else {
  printf("in the unlikely, is your exp ecting\n");
  if(likely(a&b)) {
  printf("in the likely, is your exp ecting\n");
  return 0;
执行结果:
in the unlikely,is not your exp ecting!
in the likely, is your exp ecting
  总之,likely和unlikely的功能就是添加 cache的命中率,提高系统执行速度
本文转自:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:148446次
积分:2685
积分:2685
排名:第7957名
原创:89篇
转载:167篇
评论:20条
(2)(3)(4)(1)(13)(19)(13)(6)(1)(4)(22)(13)(1)(9)(2)(1)(4)(3)(3)(15)(3)(1)(6)(7)(1)(2)(4)(1)(1)(13)(11)(12)(6)(10)(1)(3)(1)(2)(6)(13)(5)(7)Linux内核中的likely和unlikely详解_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Linux内核中的likely和unlikely详解
来源:Linux社区&
作者:ce123
Kernel version:2.6.14
CPU architecture:ARM920T
GCC version:arm-linux-gcc-3.4.1
看内核时经常遇到if(likely( )){}或是if(unlikely( ))这样的语句,不甚了解,例如(选自kernel/fork.c中copy_process):
&SET_LINKS(p);&if (unlikely(p-&ptrace & PT_PTRACED))& __ptrace_link(p, current-&parent);
下面详细分析一下。
likely() 与 unlikely()是内核中定义的两个宏。位于/include/linux/compiler.h中,具体定义如下:
#define likely(x)&__builtin_expect(!!(x), 1)#define unlikely(x)&__builtin_expect(!!(x), 0)
__builtin_expect是GCC(version&=2.9)引进的内建函数,其作用就是帮助编译器判断条件跳转的预期值,避免跳转造成时间乱费,有利于代码优化。查阅GCC手册,发现其定义如下(http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html):
&-- Built-in Function: 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.
相关资讯 & & &
& (02/05/:01)
& (12/18/:39)
& (07/28/:38)
& (01/04/:45)
& (01/17/:22)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分9637阅读权限90帖子精华可用积分9637 信誉积分176 专家积分0 在线时间529 小时注册时间最后登录
腰缠万贯, 积分 9637, 距离下一级还需 363 积分
帖子主题精华可用积分9637 信誉积分176 专家积分0 在线时间529 小时注册时间最后登录
论坛徽章:0
linux应用层里有likely()、unlikely() 之类的函数吗?如果没有,怎么实现一个
▗▖ ▝▜& && && && &&&
▐▌&&▐& &▄▖ ▗▗▖ ▗ ▗
▌▐&&▐&&▝ ▐ ▐▘▐&&▚▌
▙▟&&▐&&▗▀▜ ▐ ▐&&▟▖
▐&&▌ ▝▄ ▝▄▜ ▐ ▐ ▗▘▚
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分16069阅读权限90帖子精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
大富大贵, 积分 16069, 距离下一级还需 3931 积分
帖子主题精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
论坛徽章:0
#define likely(x) __builtin_expect (!!(x), 1)
#define unlikely(x) __builtin_expect (!!(x), 0)
是这个意思吗?
UID空间积分0 积分9637阅读权限90帖子精华可用积分9637 信誉积分176 专家积分0 在线时间529 小时注册时间最后登录
腰缠万贯, 积分 9637, 距离下一级还需 363 积分
帖子主题精华可用积分9637 信誉积分176 专家积分0 在线时间529 小时注册时间最后登录
论坛徽章:0
雨过白鹭洲
& & 是这个意思。这么做有意义吗?能否优化?如果这么用有什么不当之外
▗▖ ▝▜& && && && &&&
▐▌&&▐& &▄▖ ▗▗▖ ▗ ▗
▌▐&&▐&&▝ ▐ ▐▘▐&&▚▌
▙▟&&▐&&▗▀▜ ▐ ▐&&▟▖
▐&&▌ ▝▄ ▝▄▜ ▐ ▐ ▗▘▚
UID空间积分0 积分524阅读权限20帖子精华可用积分524 信誉积分260 专家积分45 在线时间1354 小时注册时间最后登录
丰衣足食, 积分 524, 距离下一级还需 476 积分
帖子主题精华可用积分524 信誉积分260 专家积分45 在线时间1354 小时注册时间最后登录
论坛徽章:0
觉得没有这个必要……
UID7672252空间积分0 积分48471阅读权限100帖子精华可用积分48471 信誉积分645 专家积分243 在线时间2737 小时注册时间最后登录
帖子主题精华可用积分48471 信誉积分645 专家积分243 在线时间2737 小时注册时间最后登录
论坛徽章:1
算是一种提示吧。
for (i=0; i&n; ++i) { ... }
// 告知编译器, i用得很频繁
for (i=0; i&n; ++i) { ... }复制代码if ( c ) { ... }
else { ... }
if (likely(c)) { ... } // 告知编译器, 分支通常走if而不是else
else { ... }复制代码
&一些人总认为可以用自己的思想驾驭编程语言,殊不知自己颇为自信的思想其实也被编程语言所影响着& 不管你信不信,反正我是信了。
ユッキは&&あっん~ん~&&由乃が守ってあげる&&ね? ユッキ
CU13:wwwsq,nvoy,534231qwz,qopu,jzpzy,zscoreh,uW.namrebyC
UID8600212空间积分0 积分721阅读权限20帖子精华可用积分721 信誉积分683 专家积分0 在线时间852 小时注册时间最后登录
丰衣足食, 积分 721, 距离下一级还需 279 积分
帖子主题精华可用积分721 信誉积分683 专家积分0 在线时间852 小时注册时间最后登录
论坛徽章:0
给编译器的一种提示,有利于提高生成代码的分支预测的成功率
UID空间积分0 积分16069阅读权限90帖子精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
大富大贵, 积分 16069, 距离下一级还需 3931 积分
帖子主题精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
论坛徽章:0
其实我是觉得没什么必要
UID空间积分0 积分1995阅读权限30帖子精华可用积分1995 信誉积分584 专家积分0 在线时间742 小时注册时间最后登录
家境小康, 积分 1995, 距离下一级还需 5 积分
帖子主题精华可用积分1995 信誉积分584 专家积分0 在线时间742 小时注册时间最后登录
论坛徽章:0
在内核里很有必要,你可以把内核里的likely()和unlikely()都定义成直接返回表达式,看看那个内核的性能就知道了(有点差别的,我试过)。最好用gcc4.2以上的版本编译。
UNIX和C语言是我将用一辈子的时间来理解、思考、享受的艺术。
UID7672252空间积分0 积分48471阅读权限100帖子精华可用积分48471 信誉积分645 专家积分243 在线时间2737 小时注册时间最后登录
帖子主题精华可用积分48471 信誉积分645 专家积分243 在线时间2737 小时注册时间最后登录
论坛徽章:1
看看那个内核的性能就知道了(有点差别的,我试过)
wsw1wsw2 发表于
想知道这个怎么看?
&一些人总认为可以用自己的思想驾驭编程语言,殊不知自己颇为自信的思想其实也被编程语言所影响着& 不管你信不信,反正我是信了。
ユッキは&&あっん~ん~&&由乃が守ってあげる&&ね? ユッキ
CU13:wwwsq,nvoy,534231qwz,qopu,jzpzy,zscoreh,uW.namrebyC
UID空间积分0 积分16069阅读权限90帖子精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
大富大贵, 积分 16069, 距离下一级还需 3931 积分
帖子主题精华可用积分16069 信誉积分270 专家积分75 在线时间1143 小时注册时间最后登录
论坛徽章:0
& & 难道性能差异大到连人都能感觉出来?我觉得不太可能。。}

我要回帖

更多关于 c unlikely 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信