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