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那樣,遍歷所有的條件,直至找到正確...