java性能的4,5個用法

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

           Java語言習慣用語
          1.循環
                ■ 在重要的循環里,消除循環終止判斷時的方法調用。。。
                例如:將...bt   www.bt285.cn      

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

           

                替換為…
                

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

           

                ■ 通常,把與循環index不相關的移到循環的外面
               

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

           

                應該該成:
               

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

           

          2.字符串
               ■ 消除字符串連接
               ■ 創建長字符串時,總是使用StringBuffter代替String
               ■ 預先分配StringBuffer空間   StringBuffer sb = new StringBuffer(5000);

          3.基本數據類型
               ■ 在重要的循環里使用基本數據類型(int型數據通常比long/double型數據更快)
               ■ 基本數據類型(Boolean,Integer,etc)的包裝類主要用在當傳遞的方法參數必須是一個對象的引用時(而不是一個基本數據類型)
               ■ 對所有的常量代數表達式使用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.     }  

           

             應該寫為:

           
          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.    }  

           

          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.   }   

                  優化后:

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

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

               

          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; }   

                  優化后:

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

           

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

          posted on 2009-02-17 21:37 wang9354 閱讀(2198) 評論(0)  編輯  收藏

          導航

          <2009年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          統計

          常用鏈接

          留言簿(2)

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 海盐县| 晴隆县| 达州市| 宣恩县| 灵石县| 安平县| 高尔夫| 平凉市| 清远市| 东宁县| 调兵山市| 密山市| 麻栗坡县| 福贡县| 松阳县| 康保县| 桂东县| 大港区| 建阳市| 巧家县| 阳原县| 祁门县| 龙州县| 平罗县| 桃园县| 馆陶县| 丰镇市| 大庆市| 彰武县| 福安市| 铁力市| 梨树县| 栾城县| 绥德县| 秭归县| 昌图县| 大竹县| 广丰县| 柯坪县| 江门市| 靖州|