linux内核中的likely和unlikely
时间:11-22
来源:互联网
点击:
- ,r3,r1
- 88f4:e0a44002adcr4,r4,r2
- 88f8:e88c0018stmiaip,{r3,r4}
- 88fc:e8bd8010ldmiasp!,{r4,pc}
- 8900:e89e0006ldmialr,{r1,r2}
- 8904:e3a04000movr4,#0;0x0
- 8908:e3a03001movr3,#1;0x1
- 890c:e0911003addsr1,r1,r3
- 8910:e0a22004adcr2,r2,r4
- 8914:e3a00006movr0,#6;0x6
- 8918:e88e0006stmialr,{r1,r2}
- 891c:e8bd8010ldmiasp!,{r4,pc}
- 8920:000121e0andeqr2,r1,r0,ror#3
- 8924:000121e8andeqr2,r1,r8,ror#3
- 00008928
: - 8928:e3500000cmpr0,#0;0x0
- 892c:e92d4010stmdbsp!,{r4,lr}
- 8930:e59fc044ldrip,[pc,#68];897c<.text+0x1a4>
- 8934:e59fe044ldrlr,[pc,#68];8980<.text+0x1a8>
- 8938:e3a00005movr0,#5;0x5
- 893c:1a000007bne8960
//前面通过cmp将r0和0进行比较,因为x=0的概率很大,优先执行等于0的分支 - 8940:e89c0018ldmiaip,{r3,r4}
- 8944:e3a02000movr2,#0;0x0
- 8948:e3a01001movr1,#1;0x1
- 894c:e0933001addsr3,r3,r1
- 8950:e0a44002adcr4,r4,r2
- 8954:e3a00006movr0,#6;0x6
- 8958:e88c0018stmiaip,{r3,r4}
- 895c:e8bd8010ldmiasp!,{r4,pc}
- 8960:e89e0006ldmialr,{r1,r2}
- 8964:e3a04000movr4,#0;0x0
- 8968:e3a03001movr3,#1;0x1
- 896c:e0911003addsr1,r1,r3
- 8970:e0a22004adcr2,r2,r4
- 8974:e88e0006stmialr,{r1,r2}
- 8978:e8bd8010ldmiasp!,{r4,pc}
- 897c:000121f8streqdr2,[r1],-r8
- 8980:000121f0streqdr2,[r1],-r0
[plain]view plaincopyprint?
- //test_builtin_expect.c
- inttest_likely(intx)
- {
- if(x)
- x=5;
- else
- x=6;
- returnx;
- }
- inttest_unlikely(intx)
- {
- if(x)
- x=5;
- else
- x=6;
- returnx;
- }
[plain]view plaincopyprint?
- 00008460
: - 8460:e3500000cmpr0,#0;0x0
- 8464:03a00006moveqr0,#6;0x6
- 8468:13a00005movner0,#5;0x5
- 846c:e1a0f00emovpc,lr
- 00008470
: - 8470:e3500000cmpr0,#0;0x0
- 8474:03a00006moveqr0,#6;0x6
- 8478:13a00005movner0,#5;0x5
- 847c:e1a0f00emovpc,lr
如上述例子分析所示,两个函数编译生成的汇编语句所使用到的跳转指令不一样,仔细分析下会发现__builtin_expect实际上是为了满足在大多数情况不执行跳转指令,__builtin_expect仅仅是告诉编译器优化,并没有改变其对真值的判断。宏likely和宏unlikely唯一的作用就是选择”将if分支还是else分支放在跳转指令之后,从而优化程序的执行效率”。 因为likely(EXP)代表条件表达式EXP很可能成立,而unlikely(EXP)代表条件表达式EXP很可能不成立,当程序员清楚EXP表达式 多数情况成立(不成立)时,就可使用likely(unlikely),使if分支(else分支)紧跟跳转指令其后,从而在大多数情况下不用执行跳转指令,避开跳转指令所带来的开销,从而达到优化的目的。
还有一点需要注意的是,在生成汇编时用的是arm-linux-gcc -fprofile-arcs -O2 -c test_builtin_expect.c,而不是arm-linux-gcc-O2 -c test_builtin_expect.c。
linux内核likelyunlikel 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)