日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 程序喵大人

大家平時編碼過程中肯定會有些疑問,if-else和switch-case都可用于條件判斷,那這兩種方式誰效率更高?



這里從匯編角度和大家一起分析一下。我查看匯編代碼使用的是https://godbolt.org/這個網(wǎng)站,這個網(wǎng)站相當好用,里面集成了幾十種編譯器,推薦給大家!


首先看下switch-case,即下面這張圖,左半部分是C代碼,右半部分是對應的匯編代碼,編譯選項是O3,即我們在實際項目中經(jīng)常使用的優(yōu)化選項。



從圖中可以看到,switch-case生成的匯編代碼是使用的表結(jié)構,根據(jù)case里的1、2、3、4來拿到表結(jié)構的偏移量,進而拿到對應的值。這種使用表結(jié)構的switch-case效率很高,但是有個問題,該switch-case使用表結(jié)構可能是因為case里的常量數(shù)字比較小,且連續(xù),那如果是不連續(xù)的呢,假如有1、2、3、456、987,那還使用表結(jié)構豈不是非常浪費內(nèi)存。


再看這張圖,我改動了case的條件,改成了幾個隨機數(shù):



再看對應的匯編代碼,完完全全變成了逐分支判斷,效率肯定比表結(jié)構方式更低。

繼續(xù)探究if-else的效率問題,首先看下條件是順序數(shù)字的情況,即1、2、3、4,如圖:



可以看見,對應的匯編代碼是逐分支判斷。

再看條件是非連續(xù)隨機數(shù)字的情況,如下圖:



對應的匯編代碼依舊是逐分支判斷,這里可知,if-else可不管條件里面的數(shù)字是否連續(xù),它就是不停的分支判斷,沒有任何優(yōu)化。

通過這四張圖,大家應該已經(jīng)對此問題有結(jié)論了吧?我總結(jié)一下:


  • 只有在case中的條件是連續(xù)數(shù)字或相隔不大時,編譯器會使用表結(jié)構做優(yōu)化,性能優(yōu)于if-else。

  • 其他情況下,switch-case其實就是逐個分支判斷,性能與if-else無異。

  • switch-case中的case只能是常量,而if-else用途更廣一些,本文僅討論分支是常量的情況。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉