switch與ifelse的效率問題

2021-05-25 03:14:01 字數 2306 閱讀 3819

switch與if..else 的執行的效率問題

今天讀一前輩的程式,發現其在串列埠中斷裡面為了分析協議的報文型別,在中斷函式裡面使用if..else語句。因為報文型別在現在看來只有兩種,以後有可能還會增加,不確定。

本人以為這樣用有些不妥,為什麼不用switch語句呢?猜想是不是因為效率方面的考慮呢,畢竟我們應該盡量是中斷的處理**更加簡潔,時間效率更高才好。

所以本人就查詢相關資料,資料顯示switch語句反而比ifelse的執行效率要高。

下面來詳細描述switch與ifelse的區別。

switch...case與if...else的根本區別在於,switch...case會生成乙個跳轉表來指示實際的case分支的位址,而這個跳轉表的索引號與switch變數的值是相等的。從而,switch...case不用像if...else那樣遍歷條件分支直到命中條件,而只需訪問對應索引號的表項從而到達定位分支的目的。

具體地說,switch...case會生成乙份大小(表項數)為最大case常量+1的跳表,程式首先判斷switch變數是否大於最大case 常量,若大於,則跳到default分支處理;否則取得索引號為switch變數大小的跳表項的位址(即跳表的起始位址+表項大小*索引號),程式接著跳到此位址執行,到此完成了分支的跳轉。

//int main() }

用gcc編譯器,生成彙編**(不開編譯器優化)

.file "shiyan.c"

.text

.globl main

.type main, @function

main:

leal 4(%esp), %ecx

andl $-16, %esp

pushl -4(%ecx)

pushl %ebp

movl %esp, %ebp

pushl %ecx

subl $20, %esp

movl $3, -8(%ebp)

cmpl $4, -8(%ebp)

ja .l2

movl -8(%ebp), %eax

sall $2, %eax

movl .l8(%eax), %eax

jmp *%eax

.section .rodata

.align 4

.align 4

.l8:

.long .l3

.long .l4

.long .l5

.long .l6

.long .l7

.text

.l3:

movl $0, -12(%ebp)

jmp .l11

.l4:

movl $1, -12(%ebp)

jmp .l11

.l5:

movl $2, -12(%ebp)

jmp .l11

.l6:

movl $3, -12(%ebp)

jmp .l11

.l7:

movl $4, -12(%ebp)

jmp .l11

.l2:

movl $10, -12(%ebp)

.l11:

addl $20, %esp

popl %ecx

popl %ebp

leal -4(%ecx), %esp

ret.size main, .-main

.ident "gcc: (ubuntu 4.3.3-5ubuntu4) 4.3.3"

.section .note.gnu-stack,"",@progbits

由此看來,switch有點以空間換時間的意思,而事實上也的確如此。

1.當分支較多時,當時用switch的效率是很高的。因為switch是隨機訪問的,就是確定了選擇值之後直接跳轉到那個特定的分支,但是if。。else是遍歷所以得可能值,知道找到符合條件的分支。如此看來,switch的效率確實比ifelse要高的多。

2.由上面的彙編**可知道,switch...case占用較多的**空間,因為它要生成跳表,特別是當case常量分布範圍很大但實際有效值又比較少的情況,switch...case的空間利用率將變得很低。

3.switch...case只能處理case為常量的情況,對非常量的情況是無能為力的。例如 if (a > 1 && a < 100),是無法使用switch...case來處理的。所以,switch只能是在常量選擇分支時比ifelse效率高,但是ifelse能應用於更多的場合,ifelse比較靈活。

由此看來,上面前輩的中斷處理程式中用switch是比較合適的,即節省了時間,而且對於以後程式的擴充套件也是很方便。因為報文型別這個值基本上都是用整形常量來表示的。

switch與if else的區別

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

switch case與if else執行效率分析

結論 switch.case的效率會比if.else要高一些 一 if.else語句 對if.else函式反彙編後,能看見這個函式所採用的方法是按順序去比較 jne表示 當不等於時轉移 如果輸入的數值所對應的if條件靠後的話,會進行較多次的對比判斷後,才能進入對應的分支。二 switch.case語...

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...