一、通用篇
1.1 不用new關(guān)鍵詞創(chuàng)建類的實例
1.2 使用非阻塞I/O
1.3 慎用異常
1.4 不要重復(fù)初始化變量
1.5 盡量指定類的final修飾符
1.6 盡量使用局部變量
1.7 乘法和除法
二、J2EE篇
一、通用篇
1.1 不用new關(guān)鍵詞創(chuàng)建類的實例
1.2 使用非阻塞I/O
1.3 慎用異常
1.4 不要重復(fù)初始化變量
1.5 盡量指定類的final修飾符
1.6 盡量使用局部變量
1.7 乘法和除法
二、J2EE篇
2.1 使用緩沖標(biāo)記
2.2 始終通過會話Bean訪問實體Bean
2.3 選擇合適的引用機(jī)制
2.4 在部署描述器中設(shè)置只讀屬性
2.5 緩沖對EJB Home的訪問
2.6 為EJB實現(xiàn)本地接口
2.7 生成主鍵
2.8 及時清除不再需要的會話
2.9 在JSP頁面中關(guān)閉無用的會話
2.10 Servlet與內(nèi)存使用
2.11 HTTP Keep-Alive
2.12 JDBC與Unicode
2.13 JDBC與I/O
1.14 內(nèi)存數(shù)據(jù)庫
三、GUI篇
3.1 用JAR壓縮類文件
3.2 提示Applet裝入進(jìn)程
3.3 在畫出圖形之前預(yù)先裝入它
3.4 覆蓋update方法
3.5 延遲重畫操作
3.6 使用雙緩沖區(qū)
3.7 使用BufferedImage
3.8 使用VolatileImage
3.9 使用Window Blitting
四、補(bǔ)充資料
===================================
正文:
===================================
一、通用篇
“通用篇”討論的問題適合于大多數(shù)Java應(yīng)用。
1.1 不用new關(guān)鍵詞創(chuàng)建類的實例
用new關(guān)鍵詞創(chuàng)建類的實例時,構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會被自動調(diào)用。但如果一個對象實現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會調(diào)用任何類構(gòu)造函數(shù)。
在使用設(shè)計模式(Design Pattern)的場合,如果用Factory模式創(chuàng)建對象,則改用clone()方法創(chuàng)建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現(xiàn):
public static Credit getNewCredit() {
return new Credit();
}
改進(jìn)后的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對于數(shù)組處理同樣很有用。
1.2 使用非阻塞I/O
版本較低的JDK不支持非阻塞I/O API。為避免I/O阻塞,一些應(yīng)用采用了創(chuàng)建大量線程的辦法(在較好的情況下,會使用一個緩沖池)。這種技術(shù)可以在許多必須支持并發(fā)I/O流的應(yīng)用中見到,如Web服務(wù)器、報價和拍賣應(yīng)用等。然而,創(chuàng)建Java線程需要相當(dāng)可觀的開銷。
JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應(yīng)用要求使用版本較早的JDK,在這里有一個支持非阻塞I/O的軟件包。
請參見Sun中國網(wǎng)站的《調(diào)整Java的I/O性能》。
1.3 慎用異常
異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因為在處理過程中創(chuàng)建了一個新的對象。
異常只能用于錯誤處理,不應(yīng)該用來控制程序流程。
1.4 不要重復(fù)初始化變量
默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時, Java會把變量初始化成確定的值:所有的對象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和 double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個類從另一個類派生時,這一點尤其應(yīng)該注意,因為用new關(guān)鍵詞創(chuàng)建一個對象時,構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會被自動調(diào)用。
1.5 盡量指定類的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。
另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機(jī)會內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實現(xiàn)有關(guān))。此舉能夠使性能平均提高50%。
1.6 盡量使用局部變量
調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。請參見《盡可能使用堆棧變量》。
1.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的操作,而是改用等價的左移3位操作,每左移1位相當(dāng)于乘以2。相應(yīng)地,右移1位操作相當(dāng)于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。
本篇文章來源于:開發(fā)學(xué)院 http://edu.codepub.com 原文鏈接:http://edu.codepub.com/2010/0210/20413.php