提高Java性能的幾個高效用法

  1.在重要的循環裏,消除循環終止判斷時的方法調用

 

view plaincopy to clipboardprint?
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不相關的移到循環的外面

 

view plaincopy to clipboardprint?
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;
}

改爲

view plaincopy to clipboardprint?
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輸出字符會更快

    ■ 這些技巧描述的是最可移植的建議

    ■ 你可能需要運行一些基準來判斷在你的平臺上怎麼樣是最快的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章