国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

以小博大 Java性能優化技巧集錦

2019-11-18 15:27:16
字體:
來源:轉載
供稿:網友

  可供程序利用的資源(內存、CPU時間、網絡帶寬等)是有限的,優化的目的就是讓程序用盡可能少的資源完成預定的任務。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。本文討論的主要是如何提高代碼的效率。

  一、通用篇

  “通用篇”討論的問題適合于大多數java應用。

  1.1 不用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) BaseCredit.clone();

  }


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

  1.2 使用非阻塞I/O

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

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

  1.3 慎用異常

  異常對性能不利。拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。

  異常只能用于錯誤處理,不應該用來控制程序流程。

  1.4 不要重復初始化變量

  默認情況下,調用類的構造函數時, Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注重,因為用new要害詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。

  1.5 盡量指定類的final修飾符

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

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

  1.6 盡量使用局部變量

  調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量、實例變量等,都在堆(Heap)中創建,速度較慢。另外,依靠于具體的編譯器/JVM,局部變量還可能得到進一步優化。請參見《盡可能使用堆棧變量》。

  1.7 乘法和除法

  考慮下面的代碼:

 

  for (val = 0; val < 100000; val +=5)

  {

   alterX = val * 8;

   myResult = val * 2;

  }

  用移位操作替代乘法操作可以極大地提高性能。下面是修改后的代碼:

  for (val = 0; val < 100000; val += 5)

  {

   alterX = val << 3;

   myResult = val << 1;

  }


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

  二、J2EE篇

  前面介紹的改善性能技巧適合于大多數Java應用,接下來要討論的問題適合于使用jsp、EJB或JDBC的應用。

  2.1 使用緩沖標記

  一些應用服務器加入了面向JSP的緩沖標記功能。例如,BEA的WebLogic Server從6.0版本開始支持這個功能,Open Symphony工程也同樣支持這個功能。JSP緩沖標記既能夠緩沖頁面片斷,也能夠緩沖整個頁面。當JSP頁面執行時,假如目標片斷已經在緩沖之中,則生成該片斷的代碼就不用再執行。頁面級緩沖捕捉對指定URL的請求,并緩沖整個結果頁面。對于購物籃、目錄以及門戶網站的主頁來說,這個功能極其有用。對于這類應用,頁面級緩沖能夠保存頁面執行的結果,供后繼請求使用。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红原县| 聂拉木县| 马山县| 临泽县| 土默特左旗| 新河县| 乌兰浩特市| 霍山县| 汝阳县| 奈曼旗| 本溪| 安阳市| 安龙县| 吴堡县| 上饶市| 班戈县| 定结县| 会昌县| 齐齐哈尔市| 张家界市| 武隆县| 阿坝县| 香港 | 边坝县| 呼伦贝尔市| 和硕县| 汶川县| 青田县| 白水县| 上栗县| 大姚县| 顺义区| 永吉县| 普宁市| 西昌市| 黄浦区| 平利县| 民县| 昌都县| 遂川县| 栾川县|