switch跟if else效能比較

2021-07-11 22:07:07 字數 2244 閱讀 4736

switch和if-else效能比較

switch和if-else相比,由於使用了binary tree演算法,絕大部分情況下switch會快一點,除非是if-else的第乙個條件就為true.說實話  我也沒有深入研究過這個問題的根源只是在實際開發中  沒有人會去用很多很多else if的都是用 switch case 的  後者比較清晰  給人感覺就是乙個腦子很清楚的人寫出來的東西至於效率的本質  就讓大企鵝去操心吧

-----------好的看上面就可以了,下面的可以不看了--------------------------------------------

編譯器編譯switch與編譯if...else...不同。不管有多少case,都直接跳轉,不需逐個比較查詢。

這是一段c**: 

/* $begin switch-c */ 

int switch_eg(int x) 

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部分被分配了乙個連續的查詢表,switch case中不連續的部分也被新增上了相應的條目,switch表的大小不是根據case語句的多少,而是case的最大值的最小值之間的間距。在選擇相應 的分支時,會先有乙個cmp子句,如果大於查詢表的最大值,則跳轉到default子句。而其他所有的case語句的耗時都回事o(1)。

相比於if-else結構,switch的效率絕對是要高很多的,但是switch使用查詢表的方式決定了case的條件必須是乙個連續的常量。而if-else則可以靈活的多。

可以看到if-else只是單純地乙個接乙個比較,效率比較低 

可以看出,switch的效率一般比if-else高 

switch   效率高,     從彙編**可以看出來   

switch   只計算一次值   然後都是test   ,   jmp,     

if...else   是每個條件都要計算一遍的.  

switch的效率與分支數無關   

當只有分支比較少的時候,if效率比switch高(因為switch有跳轉表)   

分支比較多,那當然是switch

switch 與 if else 效能區別

最近閒來無事,就測測switch 和if else的效能區別 我的電腦是i3的。public static void main string args else if k 2 else if k 3 else if k 4 else if k 5 else if k 6 long end1 syst...

if else 和 switch 的區別

一直說想要研究底層原理,把知識學深一些,原來真的像初中的物理老師說的那樣,把基礎的原理都學會,就能做難的題目,高難度題目的框架都是靠簡單的原理搭建的。進入正文 區別 switch i 1 當分支較多時,當時用switch的效率是很高的。因為switch是隨機訪問的,就是確定了選擇值之後直接跳轉到那個...

switch與if else的區別

單從jvm的執行效率上講的話,switch的執行效率要高於if語句 原因在於 switch語句在執行時,首先會生成乙個 跳轉表 來指示實際的case分支的位址,而這個 跳轉表 的索引號與swtich中的case值是相等的,這樣的話,switch就不用像if else那樣,遍歷所有的條件,直至找到正確...