ikely()与unlikely() 都等同于if, 此处只是做编译优化

ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?

首先明确:

if (likely(value))等价于if (value)
if (likely(a>b)) {
fun1();

if (unlikely(value))等价于if (value)

也就是说likely()和unlikely()从阅读和理解的角度是一样的。

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

  1. <linux/compiler>
  2. #define likely(x) __builtin_expect(!!(x), 1)
  3. #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后面的语句机会更大一些。通过这种

方式,编译器在编译过程中,会将可能性更大的代码紧跟着后面的代码,从而减少指令跳转带来的性能上的下降。

比如 :

  1. if (likely(a>b)) {
  2. fun1();
  3. }

复制代码

这里就是程序员可以确定 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) 的功能也是一样的。不一样的只是他们声称的二进制代码有所不一

样,这一点咱们也可以从他们的汇编代码中看到。总之,likely和unlikely的功能就是添加 cache的命中率,提高系统

执行速度。

时间: 2025-01-25 07:59:37

ikely()与unlikely() 都等同于if, 此处只是做编译优化的相关文章

在支付圈里混不懂这些行业术语 都没脸说自己是做支付的!

在支付圈里混不懂这些行业术语 都没脸说自己是做支付的! 2018-01-29 明湖集团 一.什么是限额? POS机限额常见与对私账户结算的商户,如单笔交易限额,或单卡交易限额,或每日到账限额等根据收单方不同的风险控制政策做出不同的限额要求以降低非法交易的风险. 二.什么是跳码? 所谓的跳码一般情况是指商户明明申请的是标准类行业费率,但实际消费对账单却是优惠类或减免类等费率更低的行业,收单方以获取更高的手续费差价利润. 有商户经常疑惑,为何以前消费有积分现在没有积分了或者有时候有积分有时候没有,这

不做ASO优化行吗?苹果都在玩黑幕

近几年移动应用市场发展迅速,无论是国内还是国外,各大应用商店里面,开发商都在进行着明争暗斗,抢占市场份额.大家都对应用商店比较熟悉,知道App的排名直接关系到下载量,但是由于App数量众多,要想从如此多的竞争对手中脱颖而出,很多开发商就使用了其他办法,比如说刷榜,刷好评,刷下载量等等.虽然说苹果公司表示会严厉打击这种不正当竞争手段,但是他们自己有没有做过这种不正当手段呢? 之前有人指出苹果也玩黑幕,为了给自己研发的App做"免费广告"而随意操控AppStore排行榜.具体是怎么回事呢?

缺乏这四项技能,珠海碰上雷军都不好意思说自己是做产品的

今时今日,设计的重要性对于科技行业来说已经是有目共睹的了 – 再提的话我都认为点是陈词滥调了.不管是在消费领域(Airbnb,Uber,Dropbox)还是商用领域(Slack)得产品,都有大量的公司作为例证可以说明伟大的设计所能带来的巨大价值. 这就难怪乎今年(2015)在硅谷就有超过6个风投机构对设计师抛出了橄榄枝,邀请他们成为了自己的合作伙伴.这可是史无前例的举措. 现今情况下带给网络和移动产品的产品经理们的挑战就是,搞清楚"设计"对于这个角色到底意味着什么.在我们公司中,我们常

PowerDesginer15使用教程,地球人都知道的东西,做个记录

PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesigner则与其正好相反,它是以数据库建模起家,后来才发展为一款综合全面的Case工具. PowerDesigner主要分为7种建模文件: 1.  概念数据模型 (CDM) 对数据和信息进行建模,利用实体-关系图(E-R图)的形式组织数据,检验数据设计的有效性和合理性. 2.  逻辑数据模型 (LDM)

Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统

http://www.cnblogs.com/MYSQLZOUQI/p/5257200.html glibc库是什么?没有glibc库,就没有Linux.我们平时用过的malloc和strcpy等函数都是glibc这位仁兄提供的.除此之外,它还提供了网络编程中要用到的Socket API接口.之前曝光的glibc库漏洞 f

【读书】每一天的教养,都为了孩子独立那天做准备

[博客导航] [读书导航] 摘录 ★陪孩子安静下来,比大吼大叫.跟孩子比谁的声音大来的有用.当你和孩子靠越近,他就越得把注意力放在你身上,也越能感受到你认真的态度.注意,孩子不能习惯被念叨,被“声控”久了,容易左耳进.右耳出. ★多用正面指示,取代负面禁止. ★公共场所举止得体的办法:第一.事前教育:第二.解释为什么不可以:第三.同样的话,看着孩子眼睛说三次:第四.若还不能停止,就“被停止”. ★不要等成绩出来了,才骂孩子.每天,我们都应该知道孩子是否已经尽力.这是父母亲的责任. ★孩子忘记带东

成都供卵价格做试管婴儿包出生费用多少?

[138.2605.7771薇╇電][供卵包成功][借腹生子][代生孩子]若要快乐,就要随和.若要幸福,就要随缘.快乐是心的愉悦,幸福是心的满足.别和他人争吵,别和自己争吵,别和命运争吵,无计较之心,心常愉悦.尽心之余,随缘起止,随遇而安,心常满足.你随和,愉悦的是自己的心,别人计较,苦闷的是他自己.一天的心情靠随和,一生的幸福靠随缘. ????缘是天意,份在人为.生命本是一场奇异的旅行,遇见谁都是一个美丽的意外.有愿才会有缘,如果无愿,即使有缘的人,也会擦身而过.缘是天意,份在人为.无论缘深缘

即时通信常见的几种方式,此处只做学习记录

1. 轮询 利用ajax每隔一段时间就请求一次服务器,服务器返回数据. 优点:最简单的解决方案 缺点:对服务器压力很大,浪费带宽 2. 长轮询 利用ajax请求服务器,当有数据变化的时候,立刻返回,当没有数据的时候,保持这个连接直到 断开,当断开的时候再次发出请求,一直循环 优点:最简单的解决方案,减少了对服务器的请求次数 缺点:对服务器压力大,同样浪费带宽(在保持连接的时候(hold),会消耗资源) 3. 长连接 在页面里面嵌套一个iframe,设置src为一个长连接的请求,服务器就能不断向客

python字符串编码

http://blog.csdn.net/pipisorry/article/details/44136297 文本,他们通常指显示在屏幕上的字符或者其他的记号:但是计算机不能直接处理这些字符和标记:它们只认识位(bit)和字节(byte).实际上,从屏幕上的每一块文本都是以某种字符编码(character encoding)的方式保存的.粗略地说就是,字符编码提供一种映射,使屏幕上显示的内容和内存.磁盘内存储的内容对应起来.有许多种不同的字符编码,有一些是为特定的语言,比如俄语.中文或者英语,