switch最大选项数目_随时随地学习C语言之3—if和switch哪个效率高?
之前學(xué)習(xí)C語言的時(shí)候,我經(jīng)常有一個(gè)疑問,既然有if-else if-else結(jié)構(gòu)的多分支選擇語句,C語言為何還要制定switch這種多分支選擇語句呢?直到兩年前在分析ARM平臺(tái)C語言反匯編代碼的時(shí)候,才終于明白了switch-case這種結(jié)構(gòu)存在的意義及價(jià)值。一句話來說,就是switch結(jié)構(gòu)產(chǎn)生的機(jī)器代碼更為精簡、CPU執(zhí)行起來更加高效。switch結(jié)構(gòu)相對于if-else結(jié)構(gòu)的執(zhí)行效率,選擇選項(xiàng)越多,領(lǐng)先越明顯。今天,我們分析下ARM平臺(tái)下(抱歉,我也只會(huì)ARM匯編),if-else結(jié)構(gòu)和switch-case結(jié)構(gòu)的差異和差距。
首先,下面兩圖是分別用if-else和switch-case結(jié)構(gòu)編寫的功能相同的兩段代碼:
if-else 結(jié)構(gòu)測試代碼
switch-case 結(jié)構(gòu)測試代碼
具體執(zhí)行功能為:傳入for循環(huán)次數(shù)、要判斷的值,代碼分別根據(jù)傳入值進(jìn)入相應(yīng)代碼塊,然后繼續(xù)循環(huán),不做其他操作(其實(shí)上面代碼可以進(jìn)行優(yōu)化,為了介紹方便,不做優(yōu)化)。上述兩段代碼分別執(zhí)行完成后看下程序的執(zhí)行時(shí)間。首先上一下我電腦的配置圖:
然后首先分別判斷輸入值為5,兩段代碼分別運(yùn)行1億次執(zhí)行時(shí)間分別如下:
這里大家只看時(shí)間值得user那行(第二行),看出差距來了吧,if結(jié)構(gòu)耗費(fèi)的時(shí)間是switch結(jié)構(gòu)的3倍!下面我們再判斷值9,分別運(yùn)行1億次看下結(jié)果:
差距很明顯,if結(jié)構(gòu)對值9(if結(jié)構(gòu)中排列靠后的值)比對值5(if結(jié)構(gòu)中排列較前的值)判斷時(shí)間明顯長很多,而switch結(jié)構(gòu)對數(shù)值在代碼中的排列前后順序似乎不是特別明顯,if結(jié)構(gòu)相對于switch結(jié)構(gòu)的差距更大了!是什么原因造成的這種結(jié)果呢?下面我們在arm平臺(tái)下,看下if結(jié)構(gòu)和switch結(jié)構(gòu)產(chǎn)生的反匯編代碼是什么樣子的?
我們通過下述命令(有關(guān)linux的命令,本號后續(xù)會(huì)推出《手把手教你學(xué)linux》系列,敬請關(guān)注),生成反匯編文件:
看下if結(jié)構(gòu)和swtich結(jié)構(gòu)生成的for循環(huán)匯編代碼段是什么樣子的:
if結(jié)構(gòu):
if-else 結(jié)構(gòu)反匯編結(jié)果
switch結(jié)構(gòu):
switch-case 結(jié)構(gòu)反匯編結(jié)果
注意我標(biāo)<<<<的幾行,if結(jié)構(gòu)的反匯編代碼很長,在這里只截取了判斷值0~3的一段,標(biāo)<<<<的代碼表示真正進(jìn)行數(shù)值判斷的匯編代碼,可以看到:if結(jié)構(gòu)的匯編代碼(也就是機(jī)器所做的動(dòng)作)是將接收到的實(shí)參值與程序當(dāng)中的值(按值在代碼中的排列順序)挨個(gè)進(jìn)行比較,這就是說,如果要比較的是9,if結(jié)構(gòu)就需要比較10次才會(huì)命中。反過來看下switch結(jié)構(gòu),switch結(jié)構(gòu)很巧妙的運(yùn)用了“跳轉(zhuǎn)”的思想,對任何一個(gè)case值的判斷,和值在代碼中的排列順序無關(guān),都會(huì)直接“跳轉(zhuǎn)”到符合條件的case塊中,所以,執(zhí)行速度比if結(jié)構(gòu)快得多,而且與值在代碼中的排列順序無關(guān)!反匯編代碼可以看出,switch結(jié)構(gòu)不僅比if結(jié)構(gòu)執(zhí)行效率高,占用空間也少!看圖:
相信看了上面的介紹,你對if結(jié)構(gòu)和switch結(jié)構(gòu)的優(yōu)劣性有自己的選擇了吧。實(shí)際應(yīng)用當(dāng)中,我一般遵循以下編碼“潛規(guī)則”:
1.凡是判斷層級達(dá)到4層以上的,用switch結(jié)構(gòu)。
2.凡是可能性最大的選項(xiàng),放在if結(jié)構(gòu)的最頂端。這個(gè)思想,也是ARM公司在ARM處理器多級流水線中加入“分支預(yù)測”功能的考量之一。
好啦,經(jīng)過本文的介紹,if結(jié)構(gòu)和switch結(jié)構(gòu)的效率(執(zhí)行效率、空間效率)你懂了吧~
最后
創(chuàng)一個(gè)小群,供大家學(xué)習(xí)交流聊天
如果有對學(xué)C++方面有什么疑惑問題的,或者有什么想說的想聊的大家可以一起交流學(xué)習(xí)一起進(jìn)步呀。
我偶爾也會(huì)直播給大家手把手編程
也希望大家對學(xué)C++能夠持之以恒
如果你想要學(xué)好C++最好加入一個(gè)組織,這樣大家學(xué)習(xí)的話就比較方便,還能夠共同交流和分享資料,給你推薦一個(gè)學(xué)習(xí)的組織:大牛小白C++組織 可以點(diǎn)擊編程二字,可以直達(dá)
對編程感興趣的朋友歡迎入住!!!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的switch最大选项数目_随时随地学习C语言之3—if和switch哪个效率高?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GTA5战斗机操作技巧详细说明攻略
- 下一篇: onclick 获取img 里面的id_