本文並非討論類似哪個語言效率最高等無聊的編程語言之爭,也不像《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 }
改代碼后,同樣的數據處理,只需要十幾分鍾就完成了。
我相信,在你們的項目中,找一找上面那種低效率的代碼,肯定不少!