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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

心得總結(jié):Java性能優(yōu)化技巧集錦

2019-11-18 11:25:50
字體:
供稿:網(wǎng)友

 

一、通用篇

  “通用篇”討論的問題適合于大多數(shù)java應(yīng)用。

  1.1 不用new要害詞創(chuàng)建類的實(shí)例

  用new要害詞創(chuàng)建類的實(shí)例時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。但假如一個(gè)對(duì)象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會(huì)調(diào)用任何類構(gòu)造函數(shù)。

  在使用設(shè)計(jì)模式(Design Pattern)的場合,假如用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)例非常簡單。例如,下面是Factory模式的一個(gè)典型實(shí)現(xiàn):

public static Credit getNewCredit() {
return new Credit();
}

  改進(jìn)后的代碼使用clone()方法,如下所示:

PRivate static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}

  上面的思路對(duì)于數(shù)組處理同樣很有用。

  1.2 使用非阻塞I/O

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

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

  請(qǐng)參見Sun中國網(wǎng)站的《調(diào)整Java的I/O性能》。

  1.3 慎用異常

  異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^程中創(chuàng)建了一個(gè)新的對(duì)象。

  異常只能用于錯(cuò)誤處理,不應(yīng)該用來控制程序流程。

  1.4 不要重復(fù)初始化變量

  默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí), Java會(huì)把變量初始化成確定的值:所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和 double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個(gè)類從另一個(gè)類派生時(shí),這一點(diǎn)尤其應(yīng)該注重,因?yàn)橛胣ew要害詞創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。

  1.5 盡量指定類的final修飾符

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

  另外,假如指定一個(gè)類為final,則該類所有的方法都是final。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高50%。

  1.6 盡量使用局部變量

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

  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的操作,而是改用等價(jià)的左移3位操作,每左移1位相當(dāng)于乘以2。相應(yīng)地,右移1位操作相當(dāng)于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

二、J2EE篇

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

  2.1 使用緩沖標(biāo)記

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



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 花莲市| 德兴市| 科技| 和静县| 宁陵县| 海盐县| 桂东县| 广南县| 永宁县| 闻喜县| 公主岭市| 莱西市| 五莲县| 梁山县| 唐山市| 建湖县| 师宗县| 贡嘎县| 文昌市| 绩溪县| 新乐市| 洪泽县| 云梦县| 南和县| 黄山市| 景宁| 泽普县| 白朗县| 苗栗市| 延吉市| 上林县| 通辽市| 六枝特区| 兴义市| 兴文县| 淮阳县| 阿图什市| 郯城县| 潞西市| 嘉兴市| 大新县|