性能工程系列之三JAVA優(yōu)化編程_第1頁(yè)
性能工程系列之三JAVA優(yōu)化編程_第2頁(yè)
性能工程系列之三JAVA優(yōu)化編程_第3頁(yè)
性能工程系列之三JAVA優(yōu)化編程_第4頁(yè)
性能工程系列之三JAVA優(yōu)化編程_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JAVA優(yōu)化編程性能工程系列之三PQA測(cè)試部2010年5月職業(yè)要求優(yōu)化原因o 為什么要進(jìn)行優(yōu)化?已經(jīng)出現(xiàn)了問(wèn)題為了防止出現(xiàn)問(wèn)題優(yōu)化目的o可供程序利用的資源(內(nèi)存、CPU時(shí)間、網(wǎng)絡(luò)帶寬等)是有限的,優(yōu)化的目的就是讓程序用盡可能少的資源完成預(yù)定的任務(wù)。o優(yōu)化通常包含兩方面的內(nèi)容:o減小代碼的體積;o提高代碼的運(yùn)行效率。o本文討論的主要是如何提高代碼的效率。優(yōu)化目的o在Java程序中,性能問(wèn)題的大部分原因并不在于Java語(yǔ)言,而是在于程序本身。o養(yǎng)成好的代碼編寫習(xí)慣非常重要,比如正確地、巧妙地運(yùn)用java.lang.String類和java.util.Vector類,它能夠顯著地提高程序的性能。o下

2、面我們就來(lái)具體地分析一下這方面的問(wèn)題。優(yōu)化抉擇時(shí)間空間優(yōu)化方法盡量重用對(duì)象優(yōu)化第一招優(yōu)化方法o特別是String 對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)用StringBuffer 代替。o由于系統(tǒng)不僅要花時(shí)間生成對(duì)象,以后可能還需花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理。o因此,生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。優(yōu)化方法盡量使用局部變量?jī)?yōu)化第二招優(yōu)化方法o調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。o請(qǐng)參見盡可能使用堆

3、棧變量。優(yōu)化方法不要重復(fù)初始化變量?jī)?yōu)化第三招優(yōu)化方法o默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí), Java會(huì)把變量初始化成確定的值:o所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。o當(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)用。優(yōu)化方法務(wù)必釋放不用資源優(yōu)化第四招優(yōu)化方法oJava 編程過(guò)程中,進(jìn)行數(shù)據(jù)庫(kù)連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,即使關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,會(huì)導(dǎo)致

4、嚴(yán)重的后果。oTry ocatch(Exception ex) ofinallyo優(yōu)化方法o由于JVM的有其自身的GC機(jī)制,不需要程序開發(fā)者的過(guò)多考慮,從一定程度上減輕了開發(fā)者負(fù)擔(dān),但同時(shí)也遺漏了隱患,過(guò)分的創(chuàng)建對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存,嚴(yán)重時(shí)會(huì)導(dǎo)致內(nèi)存泄露,因此,保證過(guò)期對(duì)象的及時(shí)回收具有重要意義。oJVM回收垃圾的條件是:對(duì)象不再被引用;然而,JVM的GC并非十分的機(jī)智,即使對(duì)象滿足了垃圾回收的條件也不一定會(huì)被立即回收。所以,建議我們?cè)趯?duì)象使用完畢,應(yīng)手動(dòng)置成null。優(yōu)化方法SQL語(yǔ)句盡量避免使用*優(yōu)化第五招優(yōu)化方法oORACLE在解析的過(guò)程中, 會(huì)將* 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作

5、是通過(guò)查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間。o例如:oSELECT * FROM TABLE_NAMEo一般不推薦這種方式。優(yōu)化方法盡量減少對(duì)變量的重復(fù)計(jì)算優(yōu)化第六招優(yōu)化方法o例如:for(int i = 0;i list.size; i +) ooo應(yīng)替換為:ofor(int i = 0,int len = list.size();i len; i +) oo優(yōu)化方法盡量采用lazy loading 的策略優(yōu)化第七招優(yōu)化方法o例如:oString str = “aaa”;nif(i = 1) olist.add(str);no應(yīng)替換為:oif(i = 1) nString str

6、= “aaa”;nlist.add(str);o優(yōu)化方法慎用異常優(yōu)化第八招優(yōu)化方法o異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。o只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。o 異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。優(yōu)化方法巧用可變數(shù)組優(yōu)化第九招oStringBuffer表示了可變的、可寫的字符串。o有三個(gè)構(gòu)造方法 :oStringBuffer (); /默認(rèn)分配16個(gè)字符的空間oStringBuffer (int size); /分配size個(gè)字符的空間oStringBuffer (String str); /分配16個(gè)字符+str.length

7、()個(gè)字符空間 o你可以通過(guò)StringBuffer的構(gòu)造函數(shù)來(lái)設(shè)定它的初始化容量,這樣可以明顯地提升性能。這里提到的構(gòu)造函數(shù)是StringBuffer(int length),length參數(shù)表示當(dāng)前的StringBuffer能保持的字符數(shù)量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對(duì)象創(chuàng)建之后設(shè)置它的容量。o首先我們看看StringBuffer的缺省行為,然后再找出一條更好的提升性能的途徑。oStringBuffer在內(nèi)部維護(hù)一個(gè)字符數(shù)組,當(dāng)你使用缺省的構(gòu)造函數(shù)來(lái)創(chuàng)建StringBuffer對(duì)象的時(shí)候,因?yàn)闆](méi)有設(shè)置初始

8、化字符長(zhǎng)度,StringBuffer的容量被初始化為16個(gè)字符,也就是說(shuō)缺省容量就是16個(gè)字符。當(dāng)StringBuffer達(dá)到最大容量的時(shí)候,它會(huì)將自身容量增加到當(dāng)前的2倍再加2,也就是(2*舊值+2)。如果你使用缺省值,初始化之后接著往里面追加字符,在你追加到第16個(gè)字符的時(shí)候它會(huì)將容量增加到34(2*16+2),當(dāng)追加到34個(gè)字符的時(shí)候就會(huì)將容量增加到70(2*34+2)。無(wú)論何事只要StringBuffer到達(dá)它的最大容量它就不得不創(chuàng)建一個(gè)新的字符數(shù)組然后重新將舊字符和新字符都拷貝一遍這也太昂貴了點(diǎn)。所以總是給StringBuffer設(shè)置一個(gè)合理的初始化容量值是錯(cuò)不了的,這樣會(huì)帶來(lái)立竿見

9、影的性能增益。oStringBuffer初始化過(guò)程的調(diào)整的作用由此可見一斑。所以,使用一個(gè)合適的容量值來(lái)初始化StringBuffer永遠(yuǎn)都是一個(gè)最佳的建議。優(yōu)化方法巧用System.arraycopy優(yōu)化第十招o當(dāng)復(fù)制大量數(shù)據(jù)時(shí),優(yōu)先使用System.arraycopy()命令。優(yōu)化方法增強(qiáng)代碼的可讀性優(yōu)化第十一招優(yōu)化方法o例如:opublic class ShopCart oprivate List carts ; public void add (Object item) oif(carts = null) ocarts = new ArrayList();o o crts.add(it

10、em);o 優(yōu)化方法o public void remove(Object item) o if(carts. contains(item) o carts.remove(item);o o 優(yōu)化方法opublic List getCarts() o/返回只讀列表oreturn Collections.unmodifiableList(carts);oo/不推薦這種方式o/this.getCarts().add(item);o優(yōu)化方法盡量減少數(shù)據(jù)庫(kù)的連接、數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)優(yōu)化第十二招優(yōu)化方法o創(chuàng)建數(shù)據(jù)庫(kù)連接是最消耗系統(tǒng)資源的了。實(shí)際上,一個(gè)數(shù)據(jù)庫(kù)連接在驅(qū)動(dòng)和數(shù)據(jù)庫(kù)服務(wù)器之間有多次網(wǎng)絡(luò)往返,例如

11、,當(dāng)某個(gè)驅(qū)動(dòng)連接到Oracle或Sybase時(shí),這個(gè)連接會(huì)有7到10和網(wǎng)絡(luò)往返,執(zhí)行了一系列的動(dòng)作:o校驗(yàn)用戶的身份證書o在數(shù)據(jù)庫(kù)驅(qū)動(dòng)期望的代碼頁(yè)設(shè)置和數(shù)據(jù)庫(kù)可用的代碼頁(yè)設(shè)置之間進(jìn)行協(xié)商(如果必要的話)o獲取數(shù)據(jù)庫(kù)版本信息o確定用于通信的最理想的數(shù)據(jù)庫(kù)協(xié)議包大小o設(shè)置會(huì)話設(shè)置優(yōu)化方法o使用連接池提高性能。o在條件允許的情況下犧牲部分內(nèi)存避免頻繁訪問(wèn)數(shù)據(jù)庫(kù)帶來(lái)的性能消耗。o例如:o代碼表的實(shí)現(xiàn)。oSession的使用。優(yōu)化方法array(數(shù)組) 和 ArryList的使用優(yōu)化第十三招優(yōu)化方法oarray():最高效;但是其容量固定且無(wú)法動(dòng)態(tài)改變;ArrayList:容量可動(dòng)態(tài)增長(zhǎng);但犧牲效率;o

12、基于效率和類型檢驗(yàn),應(yīng)盡可能使用array,無(wú)法確定數(shù)組大小時(shí)才使用ArrayList!oArrayList是Array的復(fù)雜版本ArrayList內(nèi)部封裝了一個(gè)Object類型的數(shù)組,從一般的意義來(lái)說(shuō),它和數(shù)組沒(méi)有本質(zhì)的差別,甚至于ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內(nèi)部數(shù)組的基礎(chǔ)上直接調(diào)用Array的對(duì)應(yīng)方法。oArrayList存入對(duì)象時(shí),拋棄類型信息,所有對(duì)象屏蔽為Object,編譯時(shí)不檢查類型,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。優(yōu)化方法用charAt()代替startsWith()優(yōu)化第十四招優(yōu)化方法o用一個(gè)字符作為參數(shù)調(diào)用startsWit

13、h()也會(huì)工作的很好,但從性能角度上來(lái)看,調(diào)用用String API無(wú)疑是錯(cuò)誤的! 例子:public class PCTS private void method(String s) if (s.startsWith(a) / violation / . 優(yōu)化方法o更正 將startsWith() 替換成charAt().public class PCTS private void method(String s) if (a = s.charAt(0) / . 優(yōu)化方法妙用條件操作符優(yōu)化第十五招優(yōu)化方法o條件操作符更加的簡(jiǎn)捷例子:public class IF public int met

14、hod(boolean isDone) if (isDone) return 0; else return 10; 優(yōu)化方法o更正:public class IF public int method(boolean isDone) return (isDone ? 0 : 10); 優(yōu)化方法o例子:public class IFAS void method(boolean isTrue) if (isTrue) _value = 0; else _value = 1; private int _value = 0;優(yōu)化方法o更正:public class IFAS void method(bo

15、olean isTrue) _value = (isTrue ? 0 : 1); / compact expression. private int _value = 0;優(yōu)化方法不要在循環(huán)體中實(shí)例化變量?jī)?yōu)化第十六招優(yōu)化方法o在循環(huán)體中實(shí)例化臨時(shí)變量將會(huì)增加內(nèi)存消耗例子: import java.util.Vector;public class LOOP void method (Vector v) for (int i=0;i v.size();i+) Object o = new Object(); o = v.elementAt(i); 優(yōu)化方法o更正: 在循環(huán)體外定義變量,并反復(fù)使用 import java.util.Vector;public class LOOP void method (Vector v) Object o; for (int i=0;iv.size();i+) o = v.elementAt(i); o不要在循環(huán)中使用oTry o catch() oo應(yīng)把其放置在最外層。優(yōu)化方法與一個(gè)接口與一個(gè)接口 進(jìn)進(jìn)行行instanceof操作操作優(yōu)化第十七招優(yōu)化方法o基于接口的設(shè)計(jì)通常是件好事,因?yàn)樗试S有不同的實(shí)現(xiàn),而又保持靈活。o

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論