有時間了,我會不段更新!
一.Android相關
1. 採用硬體加速,在androidmanifest.xml中application添加android:hardwareAccelerated="true"。不過這個需要在android 3.0才可以 使用。android4.0這個選項是預設開啟的。
2. View中設定緩衝屬性.setDrawingCache為true.
3. 最佳化你的布局。通過Android sdk中tools目錄下的layoutopt 命令查看你的布局是否需要最佳化。
4. 動態載入View. 採用ViewStub 避免一些不經常的視圖長期握住引用.
5. 將Acitivity 中的Window 的背景圖設定為空白。getWindow().setBackgroundDrawable(null);android的預設背景是不是為空白。
6. 採用<merge> 最佳化布局層數。 採用<include >來共用布局。
7. 查看Heap 的大小
8. 利用TraceView查看跟蹤函數調用。有的放矢的最佳化。
9. cursor 的使用。不過要注意管理好cursor,不要每次開啟關閉cursor.因為開啟關閉Cursor非常耗時。 Cursor.require用於刷cursor.
10. 採用環形Buffer(可以採用鏈表資料結構實現)。可以設定一個鏈表長度的上限,根據手勢的變化來不斷地更新環形Buffer的內容。
11. 採用SurfaceView在子線程重新整理UI, 避免手勢的處理和繪製在同一UI線程(普通View都這樣做)。
12. 採用JNI,將耗時間的處理放到c/c++層來處理。
13. 有些能用檔案操作的,盡量採用檔案操作,檔案操作的速度比資料庫的操作要快10倍左右。
14. 懶載入和緩衝機制。訪問網路的耗時操作啟動一個新線程來做,而不要再UI線程來做。
15. 避免建立不必要的對象
16. 如果方法用不到成員變數,可以把方法申明為static,效能會提高到15%到20%
17. 避免使用getter/setter存取field,可以把field申明為public,直接存取
18. static的變數如果不需要修改,應該使用static final修飾符定義為常量
19. 使用增強for迴圈
如:Set<Object> set = new HashSet<Object>();
// for迴圈遍曆:
for (Object obj: set) {
if(obj instanceof Integer){
int aa= (Integer)obj;
}else if(obj instanceof String){
String aa = (String)obj
} ........
}
缺點:在遍曆 集合過程中,不能對集合本身進行操作
for (String str : set) {
set.remove(str);//錯誤!
}
20. 私人內部類要訪問外部類的field或方法時,其成員變數不要用private,因為在編譯時間會產生setter/getter,影響效能。可以把外部類的field或方法聲明為包存取權限
21. 合理利用浮點數,浮點數比整型慢兩倍;
22.針對ListView的效能最佳化
item儘可能的減少使用的控制項和布局的層次;背景色與cacheColorHint設定相同顏色;
ListView中item的布局至關重要,必須儘可能的減少使用的控制項,布局。RelativeLayout是絕對的利器,通過它可以減少布局的層次。同時要儘可能的複用控制項,這樣可以減少ListView的記憶體使用量,減少滑動時GC次數。ListView的背景色與cacheColorHint設定相同顏色,可以提高滑動時的渲染效能。
ListView中getView是效能是關鍵,這裡要儘可能的最佳化。getView方法中要重用view;getView方法中不能做複雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的效能。
二.JAVA相關
1 不用new關鍵詞建立類的執行個體,用new關鍵詞建立類的執行個體時,建構函式鏈中的所有建構函式都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類建構函式。
在使用設計模式(Design Pattern)的場合,如果用Factory模式建立對象,則改用clone()方法建立新的對象執行個體非常簡單。例如,下面是Factory模式的一個典型實現:
public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
2 使用非阻塞I/O
版本較低的JDK不支援非阻塞I/O API。為避免I/O阻塞,一些應用採用了建立大量線程的辦法(在較好的情況下,會使用一個緩衝池)。這種技術可以在許多必須支援並發I/O流的應用中見到,如Web伺服器、報價和拍賣應用等。然而,建立Java線程需要相當可觀的開銷。
JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這裡有一個支援非阻塞I/O的軟體包。
3 慎用異常
異常對效能不利。拋出異常首先要建立一個新的對象。Throwable介面的建構函式調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤資訊。只要有異常被拋出,VM就必須調整呼叫堆疊,因為在處理過程中建立了一個新的對象。
異常只能用於錯誤處理,不應該用來控製程序流程。
4 不要重複初始設定變數
預設情況下,調用類的建構函式時, Java會把變數初始化成確定的值:所有的對象被設定成null,整數變數(byte、short、int、long)設定成0,float和 double變可柚貿?.0,邏輯值設定成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞建立一個對象時,建構函式鏈中的所有建構函式都會被自動調用。
5 盡量指定類的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。
另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50%。
6 盡量使用局部變數
調用方法時傳遞的參數以及在調用中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數、執行個體變數等,都在堆(Heap)中建立,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步最佳化。請參見《儘可能使用堆棧變數》。
7 乘法和除法
考慮下面的代碼:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以極大地提高效能。下面是修改後的代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
8.不要隨意的使用stingA=StringB+StringC的寫法,有大量拼接操作的地方用StringBuilder代替。