有時(shí)間了,我會(huì )不段更新!
一.Android相關(guān)
1. 采用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated="true"。不過(guò)這個(gè)需要在android 3.0才可以 使用。android4.0這個(gè)選項是默認開(kāi)啟的。
2. View中設置緩存屬性.setDrawingCache為true.21. 合理利用浮點(diǎn)數,浮點(diǎn)數比整型慢兩倍;
22.針對ListView的性能優(yōu)化
item盡可能的減少使用的控件和布局的層次;背景色與cacheColorHint設置相同顏色;ListView中item的布局至關(guān)重要,必須盡可能的減少使用的控件,布局。RelativeLayout是絕對的利器,通過(guò)它可以減少布局的層次。同時(shí)要盡可能的復用控件,這樣可以減少ListView的內存使用,減少滑動(dòng)時(shí)GC次數。ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動(dòng)時(shí)的渲染性能。ListView中getView是性能是關(guān)鍵,這里要盡可能的優(yōu)化。getView方法中要重用view;getView方法中不能做復雜的邏輯計算,特別是數據庫操作,否則會(huì )嚴重影響滑動(dòng)時(shí)的性能。
二.JAVA相關(guān)
1 不用new關(guān)鍵詞創(chuàng )建類(lèi)的實(shí)例,用new關(guān)鍵詞創(chuàng )建類(lèi)的實(shí)例時(shí),構造函數鏈中的所有構造函數都會(huì )被自動(dòng)調用。但如果一個(gè)對象實(shí)現了Cloneable接口,我們可以調用它的clone()方法。clone()方法不會(huì )調用任何類(lèi)構造函數。
在使用設計模式(Design Pattern)的場(chǎng)合,如果用Factory模式創(chuàng )建對象,則改用clone()方法創(chuàng )建新的對象實(shí)例非常簡(jiǎn)單。例如,下面是Factory模式的一個(gè)典型實(shí)現:
public static Credit getNewCredit() {
return new Credit();
}
改進(jìn)后的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對于數組處理同樣很有用。
2 使用非阻塞I/O
版本較低的JDK不支持非阻塞I/O API。為避免I/O阻塞,一些應用采用了創(chuàng )建大量線(xiàn)程的辦法(在較好的情況下,會(huì )使用一個(gè)緩沖池)。這種技術(shù)可以在許多必須支持并發(fā)I/O流的應用中見(jiàn)到,如Web服務(wù)器、報價(jià)和拍賣(mài)應用等。然而,創(chuàng )建Java線(xiàn)程需要相當可觀(guān)的開(kāi)銷(xiāo)。
JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這里有一個(gè)支持非阻塞I/O的軟件包。
3 慎用異常
異常對性能不利。拋出異常首先要創(chuàng )建一個(gè)新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過(guò)程中創(chuàng )建了一個(gè)新的對象。
異常只能用于錯誤處理,不應該用來(lái)控制程序流程。
4 不要重復初始化變量
默認情況下,調用類(lèi)的構造函數時(shí), Java會(huì )把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和 double變可柚貿?.0,邏輯值設置成false。當一個(gè)類(lèi)從另一個(gè)類(lèi)派生時(shí),這一點(diǎn)尤其應該注意,因為用new關(guān)鍵詞創(chuàng )建一個(gè)對象時(shí),構造函數鏈中的所有構造函數都會(huì )被自動(dòng)調用。
5 盡量指定類(lèi)的final修飾符
帶有final修飾符的類(lèi)是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類(lèi)指定final防止了人們覆蓋length()方法。
另外,如果指定一個(gè)類(lèi)為final,則該類(lèi)所有的方法都是final。Java編譯器會(huì )尋找機會(huì )內聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現有關(guān))。此舉能夠使性能平均提高50%。
6 盡量使用局部變量
調用方法時(shí)傳遞的參數以及在調用中創(chuàng )建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng )建,速度較慢。另外,依賴(lài)于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。請參見(jiàn)《盡可能使用堆棧變量》。
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的寫(xiě)法,有大量拼接操作的地方用StringBuilder代替。
聯(lián)系客服