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

優化JAVA性能

2013-11-15 11:52:19  來源: JSP教程 

  添加較小的輔助性函數
  
    在最初版本的Swing工具包中創建過多的PointRectangle和Dimension對象會嚴重地影響程序的性能盡管一次在一個Point或Rectangle對象中返回多個值似乎更有效率但這樣作的代價要比調用多個方法高得多在最近的Swing版本推出之前這個問題可以通過簡單地在組件或其他類中添加一些輔助性的方法得到改善如下所示
  
    public int getX() { return myBoundsx; }
    public int getY() { return myBoundsy; }
    public int getHeight() { return myBoundsheight; }
    public int getWidth() { return myBoundswidth; }
  
  
    現在調用程序可以在不創建臨時對象的情況下得到同樣的結果如下所示
  
    int x = componentgetX();
    int y = componentgetY();
    int h = componentgetHeight();
    int w = componentgetWidth();
  
  
    原來的getBounds()仍然可以使用較小的輔助性函數只不過提供了一種實現同樣目標的效率更高的方法其結果是Rectangle的接口將完全暴露在組件的接口中當修改Swing使之支持並可以使用這些較小的輔助性函數後其結果是Swing中的許多操作的運行速度都比原來快了二倍由於GUI代碼對性能比較敏感這一改進的意義是重大的
  
    這種技術帶來的負作用是對象擁有的方法更多了而且要獲取同一種信息可以有多種方法這就使文件變得相當大而且也更加復雜了不利於用戶采用這一技術但是象Swing的例子顯示的那樣在對性能要求比較高的情況下這種優化技術還是十分有效的
  
  
  可變性的利用
  
    除了在組件中添加象上面討論的getX()等具有簡單數據類型值的臨時函數外Java 還使用了其他的技術來減少在AWT和Swing中的對象創建活動在組件和其他的GUI類中添加另一種版本的getBounds()就可以在沒有創建臨時對象的前提上使調用程序得到象Rectangle類型的返回值
  
    public Rectangle getBounds(Rectangle returnVal) {
  
     returnValx = myBoundsx;
  
     returnValy = myBoundsy;
  
     returnValheight = myBoundsheight;
  
     returnValwidth = myBoundswidth;
  
     return returnVal;
  
    }
  
    調用程序仍然必須創建一個Rectangle對象不過可以在以後的調用中重用它如果一個調用程序反復調用許多Component對象就可以創建一個Rectangle對象並在每個Component中使用它需要注意的是這一技術只適用於可變的對象類型不可能通過這種方式減少創建String類對象
  
    結合二家之長
  
    一個更好的解決Point等簡單類的對象創建問題的方法是使得Point類成為不可變的然後再定義一個可變的子類具體方法如下面的例子所示
  
    public class Point {
  
     protected int x y;
  
     public Point(int x int y) { thisx = x; thisy = y; }
  
     public final int getX() { return x; }
  
     public final int getY() { return y; }
  
    }
  
    public class MutablePoint extends Point {
  
     public final void setX(int x) { thisx = x; }
  
     public final void setY(int y) { thisy = y; }
  
    }
  
    public class Shape {
  
     private MutablePoint myLocation;
  
     public Shape(int x int y) { myLocation = new MutablePoint(x y); }
  
     public Point getLocation() { return (Point) myLocation; }
  
    }
  
    在上面的例子中Shape可以安全地返回myLocation的地址因為調用程序如果試圖修改這些域或調用他們的調節器就會返回一個出錯信息當然調用程序仍然可以將Point轉換為MutablePoint但很明顯這會帶來不安全性雖然調用程序也會得到它們所需要的返回值)C++的開發人員會注意到這一技術與C++中的返回一個Rectangle的常量地址(const Rectangle&)有點類似━━Java不具備這樣的特性
  
    在Java 類庫中的javamathBigInteger類中一個類無需創建新的對象就返回一個只讀的對象MutableBigInteger類不是公開的它只供javamath類庫內部使用但由於BigInteger類中的一些方法(例如gcd())是由許多的算術操作組成的完成這些操作而無需創建臨時對象將極大地改善程序的性能
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19787.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.