<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          if-else和switch-case哪個(gè)效率更高?看這四張圖。

          共 904字,需瀏覽 2分鐘

           ·

          2021-11-09 02:23

          大家平時(shí)編碼過(guò)程中肯定會(huì)有些疑問(wèn),if-else和switch-case都可用于條件判斷,那這兩種方式誰(shuí)效率更高?



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


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



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


          再看這張圖,我改動(dòng)了case的條件,改成了幾個(gè)隨機(jī)數(shù):



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

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



          可以看見(jiàn),對(duì)應(yīng)的匯編代碼是逐分支判斷。

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



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

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


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

          • 其他情況下,switch-case其實(shí)就是逐個(gè)分支判斷,性能與if-else無(wú)異。

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

          --- EOF ---


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99国产婷婷踪合在线免费视频 | 成人天天射视频 | 91麻豆免费视频网站 | 最新中文字幕2019视频在线不卡 | e133日韩无码 |