java效能的4,5個用法

來源:互聯網
上載者:User

http://www.blogjava.net/wang9354/archive/2009/02/17/255190.html

1.迴圈
      ■ 在重要的迴圈裡,消除迴圈終止判斷時的方法調用。。。
      例如:將...bt   www.bt285.cn      

for(int i=0; i<collection.size();i++){   
  1.        ...   
  2.       }  
for(int i=0; i<collection.size();i++){...}

 

      替換為…
      

  1. for(int i=0; n=collection.size();i<n;i++){   
  2.        ...   
  3.       }  
for(int i=0; n=collection.size();i<n;i++){...}

 

      ■ 通常,把與迴圈index不相關的移到迴圈的外面
     

 
  1. for(int i=0; terminal=x.length;i<terminal;i++){   
  2.         x[i] = x[i]/scaleA *scaleB;   
  3.      }  
 for(int i=0; terminal=x.length;i<terminal;i++){x[i] = x[i]/scaleA *scaleB;}

 

      應該該成:
     

 
  1. Double scale =  scaleB*scaleA;   
  2.       for(int i=0; terminal=x.length;i<terminal;i++){   
  3.          x[i] = x[i]/scale ;   
  4.       }  
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.基礎資料型別 (Elementary Data Type)
     ■ 在重要的迴圈裡使用基礎資料型別 (Elementary Data Type)(int型資料通常比long/double型資料更快)
     ■ 基礎資料型別 (Elementary Data Type)(Boolean,Integer,etc)的封裝類主要用在當傳遞的方法參數必須是一個對象的引用時(而不是一個基礎資料型別 (Elementary Data Type))
     ■ 對所有的常量代數運算式使用static final修飾符
     ■ 使常量更容易引用(編譯器預先計算常量運算式)

 

4.異常
     ■ 異常只用於單個真正的錯誤條件 如小說520網 www.5a520.cn 拋出異常時
         拋出一個異常和執行一個catch代碼塊花費是很高的(主要由於當建立一個異常時要獲得線程棧的一個快照)
         只當條件真的異常時才拋出一個異常

     ■ 拋出異常首先要建立一個新的對象。

         Throwable介面的建構函式調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤資訊。

         只要有異常被拋出,VM就必須調整呼叫堆疊,因為在處理過程中建立了一個新的對象。

     異常只能用於錯誤處理,不應該用來控製程序流程。
     ■ 使編譯器和運行時最佳化,將幾個方法調用放在一個try/catch塊中,而不是為每個方法調用實現幾個try/catch塊

      

 
  1. try{   
  2.         Some.method1();   //Difficut for java1.4   
  3.     }catch(method1Exception e){   
  4.         handle exception 1  // to optimize this code   
  5.     }   
  6.          
  7. try{   
  8.         Some.method2();   //Difficut for java1.4   
  9.      }catch(method2Exception e){   
  10.         handle exception 2  // to optimize this code   
  11.      }   
  12.          
  13. try{   
  14.          Some.method3();   //Difficut for java1.4   
  15.      }catch(method3Exception e){   
  16.         handle exception 3  // to optimize this code   
  17.     }  
try{Some.method1();   //Difficut for java1.4}catch(method1Exception e){handle exception 1  // to optimize this code}try{Some.method2();   //Difficut for java1.4}catch(method2Exception e){handle exception 2  // to optimize this code}try{Some.method3();   //Difficut for java1.4}catch(method3Exception e){handle exception 3  // to optimize this code}

 

   應該寫為:

 
  1. try{   
  2.       Some.method1();      
  3.       Some.method2();      
  4.       Some.method3();   //Difficut for java1.4   
  5.    }catch(method1Exception e){   
  6.        handle exception 1     
  7.    }catch(method2Exception e){   
  8.        handle exception 2     
  9.    }catch(method3Exception e){   
  10.        handle exception 3     
  11.    }  
try{Some.method1();Some.method2();Some.method3();   //Difficut for java1.4}catch(method1Exception e){handle exception 1}catch(method2Exception e){handle exception 2}catch(method3Exception e){handle exception 3}

 

5.基準

     ■ 注意,所有這些技巧會因不同的平台和虛擬機器而不同
         一 例如:在有些servlet容器內,通過一個OutputStream作為位元組輸出會更快
         一 在其它的容器內,通過一個PrintWriter輸出字元會更快
     ■ 這些技巧描述的是最可移植的建議
     ■ 你可能需要運行一些基準來判斷在你的平台上怎麼樣是最快的

 

6.不用new關鍵詞建立類的執行個體

     ■用new關鍵詞建立類的執行個體時,建構函式鏈中的所有建構函式都會被自動調用。

        但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類建構函式。

        在使用設計模式(Design Pattern)的場合,如果用Factory模式建立對象,則改用clone()方法建立新的對象執行個體非常簡單。

        例如,下面是Factory模式的一個典型實現:

        

 
  1. public static Credit getNewCredit() {   
  2.    return new Credit();   
  3.   }   
public static Credit getNewCredit() {return new Credit();} 

        最佳化後:

 
  1. private static Credit BaseCredit = new Credit();   
  2. public static Credit getNewCredit() {   
  3.     return (Credit) BaseCredit.clone();   
  4. }   
private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit.clone();} 

       上面的思路對於數組處理同樣很有用。

     

7.使用非阻塞I/O 

      Java版本較低的JDK不支援非阻塞I/O API。為避免I/O阻塞,一些應用採用了建立大量線程的辦法(在較好的情況下,會使用一個緩衝池)。這種技術可以在許多必須支援並發I/O流的應用中見到,如Web伺服器、報價和拍賣應用等。然而,建立Java線程需要相當可觀的開銷。

    JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這裡有一個支援非阻塞I/O的軟體包。

 

8.不要重複初始設定變數 

      ■預設情況下,調用類的建構函式時, Java會把變數初始化成確定的值:所有的對象被設定成null,整數變數(byte、short、int、long)設定成0,float和 double變數設定成0.0,邏輯值設定成false。

      當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞建立一個對象時,建構函式鏈中的所有建構函式都會被自動調用。

 

9.盡量指定類的final修飾符 

       ■帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。

   另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50%。

 

10.盡量使用局部變數 

       ■調用方法時傳遞的參數以及在調用中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數、執行個體變數等,都在堆(Heap)中建立,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步最佳化。請參見《儘可能使用堆棧變數》。

 

11.乘法和除法 

       ■考慮下面的代碼:

 
  1. for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }   
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; } 

        最佳化後:

 
  1. for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }   
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; } 

 

       修改後的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當於乘以2。相應地,右移1位操作相當於除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難於理解,所以最好加上一些注釋。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.