前一篇談了一下程式碼中函式和介面命名的思路,今天針對我們日常程式碼中的一些小細節,談談我們可以優化的地方,希望對大家有用。
迴圈優化
明確一個概念,對方法的呼叫,即使方法中只有一句語句,也是有消耗的,包括建立棧幀、呼叫方法時保護現場、呼叫方法完畢時恢復現場等。所以例如下面的操作:
for (int i = 0; i < list.size(); i++)
{
...
}
建議替換為:
for (int i = 0, int length = list.size(); i < length; i++)
{
...
}
除此之外,如果在迴圈結構中,存在迴圈元素無關的邏輯判斷條件的計算,比如 if(A > B && B > C)建議改為if(conditionD)。
2. 將迴圈變數無關的計算都放到迴圈外,這一條不解釋。
3. 不要在迴圈中使用try…catch…,應該把其放在最外層。主要原因在於,如果迴圈中出現exception, try..catch在外層就直接跳出了迴圈,否則執行中丟擲異常就會繼續迴圈。
4.迴圈內不要不斷建立物件引用
例如:
for (int i = 1; i <= count; i++)
{
Object obj = new Object();
}
這種做法會導致記憶體中有count份Object物件引用存在,count很大的話,就耗費記憶體了,建議為改為:
Object obj = null;
for (int i = 0; i <= count; i++)
{
obj = new Object();
}
邏輯判斷優化
1. 儘量採用“懶載入”的策略,即在需要的時候才建立
例如:
String str = "forest";
if (i == 1)
{
list.add(str);
}
建議替換為:
if (i == 1)
{
String str = "forest";
list.add(str);
}
2. switch 語句按照出現頻率排序,讓最常用的放在最前面,減少無效判斷。
3. if 語句將弱計算的條件放在前面,避免過多的計算。
4. 字串變數和字串常量equals的時候將字串常量寫在前面,這是一個比較常見的小技巧了。 例如:
String str = "forest";
if (str.equals("forest"))
{
...
}
建議修改為:
String str = "forest";
if ("forest".equals(str))
{
...
}
表示式優化
降低計算強度,乘法和除法使用移位操作, 使用移位代替整數2的倍數的乘除,
使用位運算代替取餘運算。
例如:
for (val = 0; val < 100000; val += 5)
{
a = val * 8;
b = val / 2;
}
用移位操作可以極大地提高效能,因為在計算機底層,對位的操作是最方便、最快的,因此建議修改為:
for (val = 0; val < 100000; val += 5)
{
a = val << 3;
b = val >> 1;
}
2. 布林邏輯優化,這一條也是平時大家不太注意的細節,例如,!a && !b 轉換為!(a || b) ,會減少程式很大的計算量。
一點小結
程式碼中可以優化的點,其實還有很多了,舉這幾個例子的目的,就是想說明一點,多思考,多留心每一條語句執行背後的細節,就可以有很大的收穫和提高。
掃描二維碼或手動搜尋微信公眾號【架構棧】: ForestNotes
歡迎轉載,帶上以下二維碼即可