下面是加快Java程序關鍵部分執行速度的一些常規操作建議(注意對比修改前后的測試結果)。
將... 修改成... 理由
接口 抽象類(只需一個父時) 接口的多個繼承會妨礙性能的優化
非本地或數組循環變量 本地循環變量 根據前表的耗時比較,一次實例整數賦值的時間是本地整數賦值時間的1.2倍,但數組賦值的時間是本地整數賦值的2.7倍
鏈接列表(固定尺寸) 保存丟棄的鏈接項目,或將列表替換成一個循環數組(大致知道尺寸) 每新建一個對象,都相當于本地賦值980次。參考“重復利用對象”(下一節)、Van Wyk[12] p.87以及Bentley[15] p.81
x/2(或2的任意次冪) X>>2(或2的任意次冪) 使用更快的硬件指令
D.3.3 特殊情況
■字串的開銷:字串連接運算符+看似簡單,但實際需要消耗大量系統資源。編譯器可高效地連接字串,但變量字串卻要求可觀的處理器時間。例如,假設s和t是字串變量:
System.out.println("heading" + s + "trailer" + t);
上述語句要求新建一個StringBuffer(字串緩沖),追加自變量,然后用toString()將結果轉換回一個字串。因此,無論磁盤空間還是處理器時間,都會受到嚴重消耗。若準備追加多個字串,則可考慮直接使用一個字串緩沖——特別是能在一個循環里重復利用它的時候。通過在每次循環里禁止新建一個字串緩沖,可節省980單位的對象創建時間(如前所述)。利用substring()以及其他字串方法,可進一步地改善性能。如果可行,字符數組的速度甚至能夠更快。也要注意由于同步的關系,所以StringTokenizer會造成較大的開銷。
■同步:在JDK解釋器中,調用同步方法通常會比調用不同步方法慢10倍。經JIT編譯器處理后,這一性能上的差距提升到50到100倍(注意前表總結的時間顯示出要慢97倍)。所以要盡可能避免使用同步方法——若不能避免,方法的同步也要比代碼塊的同步稍快一些。
■重復利用對象:要花很長的時間來新建一個對象(根據前表總結的時間,對象的新建時間是賦值時間的980倍,而新建一個小數組的時間是賦值時間的3100倍)。因此,最明智的做法是保存和更新老對象的字段,而不是創建一個新對象。例如,不要在自己的paint()方法中新建一個Font對象。相反,應將其聲明成實例對象,再初始化一次。在這以后,可在paint()里需要的時候隨時進行更新。參見Bentley編著的《編程拾貝》,p.81[15]。
■異常:只有在不正常的情況下,才應放棄異常處理模塊。什么才叫“不正!蹦?這通常是指程序遇到了問題,而這一般是不愿見到的,所以性能不再成為優先考慮的目標。進行優化時,將小的“try-catch”塊合并到一起。由于這些塊將代碼分割成小的、各自獨立的片斷,所以會妨礙編譯器進行優化。另一方面,若過份熱衷于刪除異常處理模塊,也可能造成代碼健壯程度的下降。
■散列處理:首先,Java 1.0和1.1的標準“散列表”(Hashtable)類需要造型以及特別消耗系統資源的同步處理(570單位的賦值時間)。其次,早期的JDK庫不能自動決定最佳的表格尺寸。最后,散列函數應針對實際使用項(Key)的特征設計?紤]到所有這些原因,我們可特別設計一個散列類,令其與特定的應用程序配合,從而改善常規散列表的性能。注意Java 1.2集合庫的散列映射(HashMap)具
文章來源于領測軟件測試網 http://www.kjueaiud.com/