Android 程式碼效能調整建議

Performance

最近花了一點時間,看了一下 Android 官方文件中,如何調整執行效能的建議,原文為 Performance Tips,詳細的內容可以過去觀看,這邊只筆記幾個重點。
* 不要做你不需要做的。(Don't do work that you don't need to do.)

* 如果可以避免分配記憶體,那就不要用。(Don't allocate memory if you can avoid it.)

* 避免建立不必要的物件。每當建立物件就會需要 GC(垃圾收集),而這會降低效能。

* 假如不需要存取物件的屬性,把方法設定為 static,方法的調用會快 15%~20%。(If you don't need to access an object's fields, make your method static. Invocations will be about 15%-20% faster.)

* 基本型別 (primitive types) 和字串常數 (String constants) 使用 static final,能提高效能。

* 在 Android 中盡量不要在類別內部使用 Getter/ Setter,直接存取該變數,速度會比較快。
Without a JIT, direct field access is about 3x faster than invoking a trivial getter. With the JIT (where direct field access is as cheap as accessing a local), direct field access is about 7x faster than invoking a trivial getter.

* 使用效率較高的 For 迴圈
public void zero() {
    int sum = 0;
    for (int i = 0; i < mArray.length; ++i) {
        sum += mArray[i].mSplat;
    }
}

public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}
  • zero() 最慢,因為沒有辦法對陣列的長度做優化,每次迴圈都要存取一次。
  • one() 較快,因為把資料用區域變數來儲存,少了查詢的時間。
  • two() 最快。因為使用 for-each 迴圈。
結論是,應該盡量使用效率較高的 for-each 迴圈。

* 避免使用浮點數,能不用 float 及 double 就不要用。

* 瞭解並使用 Libraries。

* 使用 TraceView 來分析效能。這是一個效能分析工具,可以用來查看 App 的執行效能。概略說一下用法,在原程式碼中只要加入 Debug.startMethodTracing("自訂名稱"); 就會開始記錄,直到呼叫 Debug.stopMethodTracing(); 來停止。App 必須設定寫入SD卡的權限,因為執行結果會寫入SD卡名為 "自訂名稱.trace" 的檔案,然後將這個 *.trace 檔利用 adb pull 儲存到電腦中。接著利用 Andorid SDK 目錄中 tools 目錄內的 traceview.bat 來檢視這個 *.trace 檔,指令像這樣:traceview xxx.trace。

* 另外還有一篇文章 Performance Tuning On Android也可以看看,主要是在說 UI 的效能調整。

參考資料

本文網址:http://blog.tonycube.com/2013/12/android.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。