
2012年3月15日
摘要:
閱讀全文
摘要:
閱讀全文
posted @
2012-03-31 11:01 gzakoa 閱讀(1777) |
評(píng)論 (1) |
編輯 收藏
摘要:
閱讀全文
可供程序利用的資源(內(nèi)存、CPU時(shí)間、網(wǎng)絡(luò)帶寬等)是有限的,網(wǎng)站優(yōu)化的目的就是讓程序用盡可能少的資源完成預(yù)定的任務(wù)。網(wǎng)站優(yōu)化通常包含兩方面的內(nèi)容:減小代碼的體積和提高代碼的運(yùn)行效率。減小代碼的體積已經(jīng)寫過(guò)太多這類的文章了,下面就簡(jiǎn)單討論下如何提高代碼的效率。
一、不用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ì)模式(DesignPattern)的場(chǎng)合,如果用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)例非常簡(jiǎn)單。
二、使用非阻塞I/O版本較低的JDK不支持非阻塞I/OAPI。為避免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)可觀的開銷。JDK1.4引入了非阻塞的I/O庫(kù)(java.nio)。如果應(yīng)用要求使用版本較早的JDK,需要支持非阻塞I/O的軟件包。
三、慎用異常異常對(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)控制程序流程。
四、不要重復(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)用。
五、盡量指定類的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%。
六、盡量使用局部變量調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。請(qǐng)參見《盡可能使用堆棧變量》。
七、乘法和除法修改后的代碼不再做乘以的操作,而是改用等價(jià)的左移的操作,每左移1位相當(dāng)于乘以2。相應(yīng)地,右移1位操作相當(dāng)于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。