表達式優化:
加減法是計算機最喜歡的操作 執行時間爲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++)