最近花了一點時間,看了一下 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 迴圈。
* 避免使用浮點數,能不用 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 的效能調整。
好文不能不推 謝謝
回覆刪除