高性能代碼編寫原則


本文並非討論類似哪個語言效率最高等無聊的編程語言之爭,也不像《effective c》等講述某個語言的優化問題,本文只是討論編程習慣對程序性能的影響。

如果你是一個農夫,那么給你倚天劍你也只會用來鋤地,而且會抱怨效果還沒鋤頭好,如果你是一個高手,即使是摘葉飛花,也可傷敵。所以說什么語言不重要,關鍵還是看人。

這里先介紹一個心得,叫做低代價優先返回原則。

 

低代價優先返回原則

對於一段代碼,應該優先處理低代價的邏輯,低代價的邏輯包括:

1.CPU計算,不需要訪問網絡、io、數據庫的邏輯。

純CPU計算部分是最快的,應該最優先判斷,不通過就直接返回,不再計算后面的網絡、io、數據庫邏輯。如果純CPU計算部分的判斷不通過,則后續需要用到網絡、io、數據庫的邏輯部分就可以免除了,這樣可以大大減少各種io等待。

2.失敗幾率最高的邏輯。

假如一段代碼中,有A->B->C->D->OK, 四個判斷階段,其中D階段的淘汰率最高,C次之,A、B再次之,那么處理順序應該改為D->C->A->B->OK,這樣在第一個判斷階段就過濾了大量的數據流入第二階段,減少了非常多無謂的A、B階段的處理。

這里舉一個例子:

曾經看到一份代碼,先將所有需要計算的數據都統一計算好,然后再進行數據的條件判斷,不符合條件則返回,偽代碼如下:

void select(p) {
    a = calA(p);
    b = calB(p);
    c = calC(p);
    d = calD(p);

   if (a>0 && b < 0 && c < 100 && d > 5) {
      OK
   } else {
     FAIL
    }
}

估計很多人都很樂意寫這樣的代碼,感覺上就是邏輯清晰,計算數據,篩選數據,兩個步驟很明晰。特別是在某些框架中,提供的接口還強制約束着必須這樣按部就班地實現。

這個程序在執行某一個大數據量的數據邏輯處理,需要花費3天時間
將代碼改為:

void select(P) {
    d = calD(p); //d的淘汰率最高
   if (d <= 5) {
        return;
     }
     
     c = calC(p); /// 淘汰率次之
    if (c >= 100) {
         return;
     }

     a = calA(p) ;
     if (a <= 0) {
         return;
     }

     b = calB(p);
     if (b >=0 ) {
         return;
     }

     OK
}

改代碼后,同樣的數據處理,只需要十幾分鍾就完成了。
我相信,在你們的項目中,找一找上面那種低效率的代碼,肯定不少!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM