人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

Java優(yōu)化性能技巧集錦(上)

Java優(yōu)化性能技巧集錦(上)

更新時(shí)間:2022-07-29 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

一、通用篇

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

   1.1 不用new關(guān)鍵詞創(chuàng)建類的實(shí)例

   用new關(guān)鍵詞創(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)的場(chǎng)合,如果用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)例非常簡(jiǎn)單。例如,下面是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)用中見(jiàn)到,如Web服務(wù)器、報(bào)價(jià)和拍賣應(yīng)用等。然而,創(chuàng)建Java線程需要相當(dāng)可觀的開銷。

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

   請(qǐng)參見(jiàn)Sun中國(guó)網(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)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。

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

   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關(guān)鍵詞創(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)參見(jiàn)《盡可能使用堆棧變量》。

   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。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 清流县| 大城县| 雷山县| 崇明县| 云南省| 揭阳市| 沅陵县| 泾川县| 林芝县| 江西省| 景宁| 万年县| 宜良县| 竹溪县| 金平| 佳木斯市| 新和县| 随州市| 酒泉市| 祁连县| 平阴县| 灵山县| 乌鲁木齐县| 望谟县| 德令哈市| 抚顺县| 东丰县| 仙居县| 临颍县| 易门县| 察隅县| 米易县| 绵竹市| 松溪县| 保定市| 和政县| 青神县| 阳江市| 明水县| 奈曼旗| 钟山县|