程序中的基本優化

表達式優化:

加減法是計算機最喜歡的操作  執行時間爲1個時鐘週期,其次位運算的速度與加減操作接近,乘法爲5-6個時鐘週期,注意了 除法操作爲50個時鐘週期

所以在一個表達式中儘量用加減或位運算替換乘除操作,

比如 a*13等於 a<<3+a<<2+a  (向左移1位乘等於2) 任何乘法都可以改寫位運算  但是除法只適用於除數恰好是2的n次冪,比如8/13就無能爲力了


使用數學公式優化,比如求 1+2+.....n

很普通的想法就是  一個for  從1一直累加到n  這樣就需要n次循環,還有n次加法操作,還有n次條件判斷,一共消耗300個時間週期;

如果換成高斯公式 (n+1)*n/2只需要做一次加法  一次乘法 一個除法 ,當n很大時,效率是很明顯的


x=x+1  和x+=1  看似不起眼的一個習慣   其實也存在效率的問題    計算機中讀取速度:寄存器》內存》硬盤

編譯器的執行流程:  前者,尋找左邊x所在內存單元地址 尋找右邊x所在內存單元地址  右邊x+1在把結果存到左邊x內存單元(其實兩個x本來就是同一個,但是編譯器並不知道 還傻傻的去找兩次,兩次找出來的地址都是同一個)

後者,  表達式裏面只出現了一次x  所以編譯器直接去找x的內存單元地址,計算x+1保存結果 

看的出來前者在多讀了一次內存  淡淡一條並看不出差別 假設一下你在循環一個有5W條數據的數據庫,還是有感覺的

分支優化:

有一篇英文小說  現在有個需求統計裏面  字母  數字 空格的個數,

普通想法  先轉化爲數組    循環一邊    if(數字) num++  else if(空格) bnk++  else if(字符) chr++

看似很平淡   仔細一想既然是英文文章 那麼出現最多的應該是 字母其次是空格  所以把上面的if條件改變一下位置    if(字母) chr++ else if(空格)  bnk++  else if(數字) num++  

第一種判斷方式  大部分要判斷三次   而第二種方式大部分只需要判斷兩次


一次性計算

一個很常見的例子

for(int i=0;i<strlen(arr),i++) 

這個例子 每次循環 都要判斷條件  判斷條件就要計算strlen(arr);  下面的寫法可以減少計算

int len = strlen(arr)

for( int i = 0 ; i< len ; i++)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章