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

首頁 > 學院 > 開發(fā)設計 > 正文

進階教程——Java性能優(yōu)化通用篇

2019-11-18 13:12:01
字體:
供稿:網(wǎng)友

  一、通用篇
  “通用篇”討論的問題適合于大多數(shù)java應用。
  
  1.1 不用new要害詞創(chuàng)建類的實例
  
  用new要害詞創(chuàng)建類的實例時,構造函數(shù)鏈中的所有構造函數(shù)都會被自動調(diào)用。但假如一個對象實現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會調(diào)用任何類構造函數(shù)。
  
  
  在使用設計模式(Design Pattern)的場合,假如用Factory模式創(chuàng)建對象,則改用clone()方法創(chuàng)建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現(xiàn):
  
  public static Credit getNewCredit() {return new Credit();}
  
  改進后的代碼使用clone()方法,如下所示:
  
  PRivate static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit.clone();}
  
  上面的思路對于數(shù)組處理同樣很有用。
  
  1.2 使用非阻塞I/O
  
  版本較低的JDK不支持非阻塞I/O API。為避免I/O阻塞,一些應用采用了創(chuàng)建大量線程的辦法(在較好的情況下,會使用一個緩沖池)。這種技術可以在許多必須支持并發(fā)I/O流的應用中見到,如Web服務器、報價和拍賣應用等。然而,創(chuàng)建Java線程需要相當可觀的開銷。
  
  JDK 1.4引入了非阻塞的I/O庫(java.nio)。假如應用要求使用版本較早的JDK,在這里有一個支持非阻塞I/O的軟件包。
  
  1.3 慎用異常
  
  異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象。Throwable接口的構造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因為在處理過程中創(chuàng)建了一個新的對象。
  
  異常只能用于錯誤處理,不應該用來控制程序流程。
  
  1.4 不要重復初始化變量
  
  默認情況下,調(diào)用類的構造函數(shù)時, Java會把變量初始化成確定的值:所有的對象被設置成null,整數(shù)變量(byte、short、int、long)設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注重,因為用new要害詞創(chuàng)建一個對象時,構造函數(shù)鏈中的所有構造函數(shù)都會被自動調(diào)用。
  
  1.5 盡量指定類的final修飾符
  
  帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。
  
  另外,假如指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實現(xiàn)有關)。此舉能夠使性能平均提高50%。
  
  1.6 盡量使用局部變量
  
  調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依靠于具體的編譯器/JVM,局部變量還可能得到進一步優(yōu)化。
  
  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。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇平县| 方山县| 沾益县| 琼中| 香港 | 沙雅县| 松阳县| 宝兴县| 如东县| 重庆市| 沅陵县| 祁连县| 安平县| 兖州市| 泽州县| 五大连池市| 都昌县| 卓尼县| 白山市| 泰和县| 涪陵区| 杭锦后旗| 贺兰县| 含山县| 西安市| 云梦县| 礼泉县| 姚安县| 扶沟县| 津市市| 南部县| 镇雄县| 南木林县| 清河县| 乳源| 揭东县| 吉隆县| 濉溪县| 遂平县| 孝感市| 永泰县|