1.在重要的循環裡,消除循環終止判斷時的方法調用
複製代碼代碼如下:
for(int i=0; i<collection.size(); i++)
{
…
}
for(int i=0; i<collection.size(); i++)
{
…
}
替換為…
複製代碼代碼如下:
view plaincopy to clipboardprint?
for(int i=0;n=collection.size();i<n;i++)
{
…
}
2.通常,把與循環index不相關的移到循環的外面
複製代碼代碼如下:
for(int i=0;terminal=x.length;i<terminal;i++){
X[i]=x[i]/scaleA*scaleB;
}
for(int i=0;terminal=x.length;i<terminal;i++){
X[i]=x[i]/scaleA*scaleB;
}
改為
複製代碼代碼如下:
double scale = scaleB/scaleA;
for(int i=0; terminal=x.length; i<terminal; i++){
X[i]=x[i]*scale;
}
2.字串
消除字串連線建立長字串時,總是使用StringBuffter取代String
預先分配StringBuffer空間
StringBuffer sb = new StringBuffer(5000);
3.基本資料類型
在重要的循環裡使用基本資料型態(int型資料通常比long/double型資料更快)
基本資料型別(Boolean,Integer,etc)的包裝類別主要用在當傳遞的方法參數必須是一個物件的參考時(而不是一個基本資料型別)
對所有的常數代數表達式使用static final修飾符
一使常數更容易引用(編譯器預先計算常數表達式)
4.異常
異常只用於單一真正的錯誤條件
一拋出一個異常和執行一個catch程式碼區塊花費是很高的(主要由於當創建一個異常時要獲得線程棧的一個快照)
一隻當條件真的異常時才拋出一個異常
使編譯器和運行時最優化,將幾個方法呼叫放在一個try/catch區塊中,而不是為每個方法呼叫實作幾個try/catch區塊
5.基準
請注意,所有這些技巧會因不同的平台和虛擬機器而不同
一例如:在有些servlet容器內,透過一個OutputStream作為位元組輸出會更快一在其它的容器內,透過一個PrintWriter輸出字元會更快
這些技巧描述的是最可移植的建議
你可能需要運行一些基準來判斷在你的平台上怎麼樣是最快的