亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  為什么建議少用if語句!

為什么建議少用if語句!

時間:2024-02-10

相信大家或多或少的聽說過,少用點if-else吧?但是為什么要少用呢,有人說他會影響程序運行效率,但是這并不是他最大的罪狀...

if-else 的罪狀

if-else 作為三種最基本的程序結構之一,是我們從最開始學習編程時就接觸的基本語句。但是到后面的階段就不斷聽人說少用if-else。

如果詢問原因的話,你得到的結果大概率是if-else導致程序運行效率下降。這次來扯扯為什么我們說要少用if-else。

  • 導致程序運行效率下降(大部分時候可以忽略)
  • 破壞程序結構,導致代碼難以維護(核心原因 ?)

if 語句與運行效率

說起if語句導致程序運行效率下降,就不得不提到CPU的流水線結構,效率降低主要是由于多級流水線結構造成的。

現代的大部分CPU在執行代碼的時候并不是讀取一條指令然后執行一條執行的,而是使用了一種叫做流水線技術的方式,同時去執行多個操作。

流水線的影響

比如三級流水線就是指,CPU在執行一條指令時,同時會讀取后面的指令,并對進行譯碼。(讀取、譯碼、執行)

這樣處理的優勢很明顯,使用流水線技術可以大大的提高執行效率。

但是它并不是所有時刻有效的,在程序中執行跳轉代碼時,CPU 會丟棄流水線現有的結果。
原因嘛,很簡單!我都不執行后面的代碼了,你提前讀取有啥用~

所以在這個時候if語句相對于順序執行的指令,會有幾個時鐘周期的差距。但這不是if語句所特有的,所有帶跳轉結構的語句都會這樣(if、switch、for)。

分支預測的影響

多級流水線在遇到跳轉時,會有幾個時鐘的周期的影響,但這并不是它被指控運行效率低的主要原因。
而是在因為它分支預測部分,它有可能有10-20個時鐘周期的影響,在大量使用if的地方這種影響將被放大。

下面說說分支預測為什么會有這么大的影響。

在上面說到多級流水在遇到跳轉指令時會清空當前流水線,CPU的設計者在設計引入了一種叫做分支預測的技術來進行處理這個問題。
分支預測簡單說就是猜測后面的程序會執行那一段代碼,并提前將它讀取。

例如一輛火車,在有很多岔道的路上前進,為了不讓他每次都在岔道停下等待(清空流水線),于是想出了一個辦法。
猜測火車需要前進的方向,如果猜中了火車就可以不用停下等待,而提高效率。
但是如果猜錯了,則需要倒車回到岔路口重新選擇。這樣的錯誤代價就比較高了。

而大家所說的效率降低主要源于此。

if-else 對程序結構的影響

在大部分情況下,我們是不需要考慮if語句對代碼執行效率的影響,我們甚至感覺不到它的存在。
因為大部分情況下,CPU的性能是足夠的(性能優化時除外)。

但是if-else對程序結構的影響卻是不容忽視的,因為我們可以直觀的感受到它的存在,而且對開發和維護有極大的影響。

看下面一段代碼:

if (condition1==true)
    {f1();}
else if (condition2==true)
    {f2();}
else if (condition3==true)
    {f3();}

這個代碼非常簡單:判斷不同條件時執行不同的代碼塊。
這段代碼寫完測試時發現有點問題

  1. condition1和condition3同時滿足時應該先執行f4
  2. condition3和condition4滿足任意一個時執行f3
    修改代碼測試通過后,于是乎代碼變成了下面的模樣:

else if (condition1==true)
{
  if (condition3==true)
  { f4(); }
  f1(); 
}
else if (condition2==true)
    { f2(); }
else if (condition3==true || condition4==true)
    { f3(); }

這只是我簡單模擬的一段代碼,對于稍微復雜的邏輯,if-else的數量遠遠大于上面的數量。

在這樣的代碼中,如果各種condition都是使用flag變量進行標記時,將會是一種巨大的災難。

我之前碰到這樣的代碼時,心情只能用下圖表示。

大量使用if-else,會使代碼變得難以理解,同時增加后期開發和維護的成本。

這個才是少用if-else真的原因!

如何消除if-else

既然上面說到了if-else有這么多的問題,那應該怎樣減少使用它呢,

1. 巧妙使用算術表達式

比如下面的代碼,在num不能被5整除時,num加一

if(num%5>0)
{
  num++;
}

可以替換成 num = num + !!(num%5);

這種一般是在對計算結果進行簡單判斷時可使用,它的優化點在于消除了分支結構,提高了執行效率。(雖然說很小)。

使用斷言(assert)

在對函數參數進行合法性檢查時常用,可以減少大量對參數進行時的if-else,適用場景也比較簡單。

查找表(函數轉移表)

查找表或者函數轉移表,可以對程序的整體結構進行優化或者改進。
比如下面一個計算器的代碼:

if(oper == ADD)
{ Result=add(op1,op2);}
else if(oper == SUB)
{ Result=add(op1,op2);}
if(oper == MUL)
{ Result=mul(op1,op2);}
else if(oper == DIV)
{ Result=div(op1,op2);}

使用函數轉移表可改進為

typedef int (*oper_t)(intint);
oper_t oper_table[]={add, sub, mul, div};
...
result = oper_table[oper](op1,op2);

查找表則相對更靈活,可以對不同類型的數據進行查找;

#define arrayof(x)  (sizeof(x)/sizeof(x[0]))
typedef int (*oper_t)(intint);
struct find_table_t {
  char *oper_name;
  oper_t oper_func;
}
find_table_t oper_table[]=
{{"add",add}, {"sub",sub}, {"mul",mul}, {"div",div}};

for(int i=0; i<arrayof(oper_table);i++)
{
  if(strcmp(oper,oper[i].oper_name)==0)
  {
    result = oper[i].func(op1,op2);
    return result;
  }
}

責任鏈(職責鏈)

責任鏈將一個復雜邏輯的流程進行分解,將每個判斷條件的判斷交給責任鏈節點進行處理,在處理完成后將結果傳遞給下一個節點。

在后面有專門一篇文章寫責任鏈模式,在這就不展開了。

狀態機

狀態機也是消除if-else的一種方法,在狀態機中對所有條件的判斷變成的狀態轉移。

在后面也會有單獨的文章講解有限狀態機的實現和應用。



end



往期推薦



四萬字長文,這是我見過最好的模板元編程文章!

如何正確的理解指針和結構體指針、指針函數、函數指針這些東西?

C++為什么要弄出虛表這個東西?

研究了一波RTTI,再介紹軟件開發的201個原則,文末再送6本書

【性能優化】高效內存池的設計與實現

這么多家公司都裁員?辟謠了,我該何去何從?

分享大廠的一些筆試題目

騰訊 C++ 筆試/面試題及答案



亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品成人欧美大片古装| 快she精品国产999| 国产欧美精品日韩精品| 欧美在线观看视频在线| 亚洲网站在线观看| 精品999在线播放| 国产欧美另类| 国产一区二区三区的电影| 国产精品福利片| 欧美国产日韩精品| 欧美日韩国产综合视频在线观看中文 | 亚洲精品美女久久7777777| 国产精品福利在线观看网址| 欧美激情一区二区久久久| 一区二区三区毛片| 国产精品毛片大码女人| 欧美日本高清一区| 国产精品人成在线观看免费| 裸体一区二区| 尤妮丝一区二区裸体视频| 国产精品视频大全| 国产精品视频| 国产精品视频久久一区| 国产日韩欧美视频在线| 永久久久久久| 欧美影片第一页| 国产有码在线一区二区视频| 亚洲国产黄色| 亚洲一区二区三区激情| 久久福利资源站| 亚洲欧美视频在线观看| 久久免费视频一区| 欧美成人一区二区三区在线观看| 国产精品久久国产精品99gif| 欧美日韩精品免费观看视频完整| 麻豆国产精品777777在线| 久久精品卡一| 久久一二三区| 欧美日韩精品免费看| 欧美三日本三级三级在线播放| 欧美视频精品一区| 国产精品欧美日韩一区二区| 国产精品私人影院| 国产精品一区二区三区久久久| 黄色成人在线网站| 国产视频自拍一区| 亚洲第一偷拍| 亚洲视频在线观看网站| 欧美一区二区网站| 麻豆成人综合网| 欧美三级视频| 黄色亚洲精品| 激情文学综合丁香| 亚洲丝袜av一区| 噜噜噜躁狠狠躁狠狠精品视频| 欧美韩日视频| 国产精品99免费看| 在线观看日韩欧美| 午夜精品久久久久99热蜜桃导演| 久久米奇亚洲| 国产精品毛片高清在线完整版| 国产精品视频免费在线观看| 激情成人亚洲| 亚洲欧美国产精品专区久久| 久久精品国产成人| 国产精品乱码一区二三区小蝌蚪| 亚洲国产色一区| 亚洲免费影视第一页| 久久一区免费| 国产亚洲午夜| 在线视频一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩亚洲一区二区三区在线观看 | 国产老肥熟一区二区三区| 亚洲巨乳在线| 国产精品乱码久久久久久| 亚洲欧美一区二区三区久久| 国产伦精品一区二区三区免费迷| 欧美精品粉嫩高潮一区二区| 亚洲欧美国产毛片在线| 亚洲电影欧美电影有声小说| 欧美国产91| 一区精品在线播放| 久久久精品国产一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 免费欧美在线| 欧美精品精品一区| 国内精品免费在线观看| 欧美日韩亚洲三区| 亚洲国产欧美一区| 久久香蕉国产线看观看网| 国产婷婷色一区二区三区四区| 一区二区三区免费在线观看| 欧美精品电影| 在线成人黄色| 最新热久久免费视频| 国产日韩精品久久| 国产一区二区三区直播精品电影| 国产一区二区成人久久免费影院| 久久久久免费观看| 午夜精品三级视频福利| 国产美女精品在线| 欧美视频精品在线| 亚洲乱码一区二区| 毛片精品免费在线观看| 国产视频不卡| 欧美在线不卡视频| 国产午夜精品美女毛片视频| 久久精品亚洲一区二区三区浴池| 国产日韩精品电影| 欧美1级日本1级| **欧美日韩vr在线| 欧美激情一区二区三区全黄| 1204国产成人精品视频| 免费亚洲电影在线观看| 亚洲国产欧美一区二区三区久久| 免费人成精品欧美精品| 亚洲国产精品999| 欧美成人综合| 亚洲精品在线免费| 欧美视频在线观看免费| 亚洲男人av电影| 国产真实久久| 欧美国产先锋| 在线视频欧美日韩| 国产亚洲一区二区三区在线观看| 欧美一区影院| 亚洲国产婷婷香蕉久久久久久99| 欧美精品九九| 久久精品中文| 99pao成人国产永久免费视频| 国产精品美女久久久久久2018| 亚洲欧美在线观看| 一区在线电影| 国产精品久久福利| 午夜精品久久久久久久久| ●精品国产综合乱码久久久久| 欧美成人在线免费视频| 欧美亚洲综合另类| 亚洲二区免费| 国产伊人精品| 在线看国产日韩| 欧美日韩久久精品| 久久免费国产| 99这里只有精品| 一区二区在线观看视频| 欧美日韩一二区| 欧美69视频| 欧美一区二区精品在线| 99综合精品| 91久久精品日日躁夜夜躁国产| 中文精品视频| 久久久久国产一区二区| 国产精品一区=区| 欧美一区在线直播| 国产一区二区黄| 欧美日韩国产电影| 中文欧美日韩| 国产欧美成人| 久久亚裔精品欧美| 亚洲人成77777在线观看网| 欧美日韩在线一二三| 99国产精品久久久久久久成人热| 欧美精品一区二区三区蜜桃| 亚洲精品麻豆| 国产亚洲a∨片在线观看| 欧美日本国产在线| 一区二区日韩精品| 日韩一级免费| 国产一区二区日韩| 欧美日韩在线播放三区四区| 猛干欧美女孩| 亚洲丶国产丶欧美一区二区三区| 欧美日韩国产精品一区| 欧美国产激情二区三区| 99国产精品一区| 久久久亚洲高清| 国产免费亚洲高清| 欧美日本在线观看| 久久五月婷婷丁香社区| 欧美四级电影网站| 亚洲在线黄色| 亚洲精品欧美| 伊人久久av导航| 国产最新精品精品你懂的| 国产亚洲精品激情久久| 国产精品一区免费观看| 国产麻豆午夜三级精品| 国产日韩精品入口| 国产欧美日韩在线观看| 国产无一区二区| 欧美在线日韩精品| 亚洲一区精品电影| 亚洲视频第一页| 亚洲午夜视频在线| 米奇777在线欧美播放| 久久国产婷婷国产香蕉| 99天天综合性| 日韩视频精品| 一区二区三区四区国产精品|