在進行編程的時候,if-else和switch-case都可用於條件判斷,這篇文章寫一寫兩者的區別。
這里從匯編角度和大家一起分析一下。在網站:https://godbolt.org/上可以查看匯編代碼。
1、switch-case
下面這張圖是switch-case,左半部分是C代碼,右半部分是對應的匯編代碼。
從圖中可以看到,switch-case生成的匯編代碼是使用的表結構,根據case里的1、2、3、4來拿到表結構的偏移量,進而拿到對應的值。這種使用表結構的switch-case效率很高,但是有個問題,該switch-case使用表結構可能是因為case里的常量數字比較小,且連續,那如果是不連續的呢,假如有1、2、3、456、987,那還使用表結構豈不是非常浪費內存。
我們將case改成幾個隨機數,C語言和匯編的對比如下圖
此時對應的匯編代碼,完完全全變成了逐分支判斷,效率肯定比表結構方式更低。
2、if-else
繼續探究if-else的效率問題,首先看下條件是順序數字的情況,即1、2、3、4,如圖:
可以看見,對應的匯編代碼是逐分支判斷。
再看條件是非連續隨機數字的情況,如下圖:
對應的匯編代碼依舊是逐分支判斷,這里可知,if-else可不管條件里面的數字是否連續,它就是不停的分支判斷,沒有任何優化。
3、總結:
- 只有在case中的條件是連續數字或相隔不大時,編譯器會使用表結構做優化,性能優於if-else。
- 其他情況下,switch-case其實就是逐個分支判斷,性能與if-else無異。
- switch-case中的case只能是常量,而if-else用途更廣一些,本文僅討論分支是常量的情況。