熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

進階教程——Java性能優化通用篇

2013-11-15 11:51:21  來源: JSP教程 

  通用篇
  通用篇討論的問題適合於大多數Java應用
  
   不用new關鍵詞創建類的實例
  
  用new關鍵詞創建類的實例時構造函數鏈中的所有構造函數都會被自動調用但如果一個對象實現了Cloneable接口我們可以調用它的clone()方法clone()方法不會調用任何類構造函數
  
  
  在使用設計模式(Design Pattern)的場合如果用Factory模式創建對象則改用clone()方法創建新的對象實例非常簡單例如下面是Factory模式的一個典型實現
  
  public static Credit getNewCredit() {return new Credit();}
  
  改進後的代碼使用clone()方法如下所示
  
  private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCreditclone();}
  
  上面的思路對於數組處理同樣很有用
  
   使用非阻塞I/O
  
  版本較低的JDK不支持非阻塞I/O API為避免I/O阻塞一些應用采用了創建大量線程的辦法(在較好的情況下會使用一個緩沖池)這種技術可以在許多必須支持並發I/O流的應用中見到如Web服務器報價和拍賣應用等然而創建Java線程需要相當可觀的開銷
  
  JDK 引入了非阻塞的I/O庫(javanio)如果應用要求使用版本較早的JDK在這裡有一個支持非阻塞I/O的軟件包
  
   慎用異常
  
  異常對性能不利拋出異常首先要創建一個新的對象Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法fillInStackTrace()方法檢查堆棧收集調用跟蹤信息只要有異常被拋出VM就必須調整調用堆棧因為在處理過程中創建了一個新的對象
  
  異常只能用於錯誤處理不應該用來控制程序流程
  
   不要重復初始化變量
  
  默認情況下調用類的構造函數時 Java會把變量初始化成確定的值所有的對象被設置成null整數變量(byteshortintlong)設置成float和double變量設置成邏輯值設置成false當一個類從另一個類派生時這一點尤其應該注意因為用new關鍵詞創建一個對象時構造函數鏈中的所有構造函數都會被自動調用
  
   盡量指定類的final修飾符
  
  帶有final修飾符的類是不可派生的在Java核心API中有許多應用final的例子例如javalangString為String類指定final防止了人們覆蓋length()方法
  
  另外如果指定一個類為final則該類所有的方法都是finalJava編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)此舉能夠使性能平均提高%
  
   盡量使用局部變量
  
  調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中速度較快其他變量如靜態變量實例變量等都在堆(Heap)中創建速度較慢另外依賴於具體的編譯器/JVM局部變量還可能得到進一步優化
  
   乘法和除法
  
  考慮下面的代碼
  
  for (val = ; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
  
  用移位操作替代乘法操作可以極大地提高性能。tW.wInGwIt.cOm下面是修改後的代碼:
  
  for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
  
  修改後的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當於乘以2。相應地,右移1位操作相當於除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難於理解,所以最好加上一些注釋。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19756.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.