談談程式碼效能優化中的一些小細節

ForestXie發表於2017-09-15

前一篇談了一下程式碼中函式和介面命名的思路,今天針對我們日常程式碼中的一些小細節,談談我們可以優化的地方,希望對大家有用。


迴圈優化

    1. 明確一個概念,對方法的呼叫,即使方法中只有一句語句,也是有消耗的,包括建立棧幀、呼叫方法時保護現場、呼叫方法完畢時恢復現場等。所以例如下面的操作:


    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))

    {

    ...

    }



    表示式優化


    1. 降低計算強度,乘法和除法使用移位操作, 使用移位代替整數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

    歡迎轉載,帶上以下二維碼即可

    談談程式碼效能優化中的一些小細節


    相關文章