if else和switch的效率
switch和if-else相比,由于使用了Binary Tree算法,絕大部分情況下switch會快一點,除非是if-else的第一個條件就為true.?
說實話? 我也沒有深入研究過這個問題的根源?
只是在實際開發(fā)中? 沒有人會去用很多很多else if的?
都是用 switch case 的? 后者比較清晰? 給人感覺就是一個腦子很清楚的人寫出來的東西?
至于效率的本質(zhì)? 就讓大企鵝去操心吧?
編譯器編譯switch與編譯if...else...不同。不管有多少case,都直接跳轉(zhuǎn),不需逐個比較查詢。?
昨天發(fā)現(xiàn)了一本叫做CSAPP的書,終于找到了關(guān)于switch問題的解答。?
這是一段C代碼:?
/* $begin switch-c */?
int switch_eg(int x)?
{?
??? int result = x;?
??? switch (x) {?
??? case 100:?
??? result *= 13;?
??? break;?
??? case 102:?
??? result += 10;?
??? /* Fall through */?
??? case 103:?
??? result += 11;?
??? break;?
??? case 104:?
??? case 106:?
??? result *= result;?
??? break;?
??? default:?
??? result = 0;???????
??? }?
??? return result;?
}?
/* $end switch-c */?
用GCC匯編出來的代碼如下:?
??? .file??? "switch.c"?
??? .version??? "01.01"?
gcc2_compiled.:?
.text?
??? .align 4?
.globl switch_eg?
??? .type???? switch_eg,@function?
switch_eg:?
??? pushl %ebp?
??? movl %esp,%ebp?
??? movl 8(%ebp),%edx?
??? leal -100(%edx),%eax?
??? cmpl ,%eax?
??? ja .L9?
??? jmp *.L10(,%eax,4)?
??? .p2align 4,,7?
.section??? .rodata?
??? .align 4?
??? .align 4?
.L10:?
??? .long .L4?
??? .long .L9?
??? .long .L5?
??? .long .L6?
??? .long .L8?
??? .long .L9?
??? .long .L8?
.text?
??? .p2align 4,,7?
.L4:?
??? leal (%edx,%edx,2),%eax?
??? leal (%edx,%eax,4),%edx?
??? jmp .L3?
??? .p2align 4,,7?
.L5:?
??? addl ,%edx?
.L6:?
??? addl ,%edx?
??? jmp .L3?
??? .p2align 4,,7?
.L8:?
??? imull %edx,%edx?
??? jmp .L3?
??? .p2align 4,,7?
.L9:?
??? xorl %edx,%edx?
.L3:?
??? movl %edx,%eax?
??? movl %ebp,%esp?
??? popl %ebp?
??? ret?
.Lfe1:?
??? .size???? switch_eg,.Lfe1-switch_eg?
??? .ident??? "GCC: (GNU) 2.95.3 20010315 (release)"?
在上面的匯編代碼中我們可以很清楚的看到switch部分被分配了一個連續(xù)的查找表,switch case中不連續(xù)的部分也被添加上了相應(yīng)的條目,switch表的大小不是根據(jù)case語句的多少,而是case的最大值的最小值之間的間距。在選擇相應(yīng) 的分支時,會先有一個cmp子句,如果大于查找表的最大值,則跳轉(zhuǎn)到default子句。而其他所有的case語句的耗時都回事O(1)。?
相比于if-else結(jié)構(gòu),switch的效率絕對是要高很多的,但是switch使用查找表的方式?jīng)Q定了case的條件必須是一個連續(xù)的常量。而if-else則可以靈活的多。?
可以看到if-else只是單純地一個接一個比較,效率比較低?
可以看出,switch的效率一般比if-else高?
switch?? 效率高,???? 從匯編代碼可以看出來???
switch?? 只計算一次值?? 然后都是test?? ,?? jmp,?????
if...else?? 是每個條件都要計算一遍的.??
switch的效率與分支數(shù)無關(guān)???
?當只有分支比較少的時候,if效率比switch高(因為switch有跳轉(zhuǎn)表)???
?分支比較多,那當然是switch
總結(jié)
以上是生活随笔為你收集整理的if else和switch的效率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Docker打造多版本PHP运行环境
- 下一篇: 项目托管到GitHub及简单使用