真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java代碼怎么提高性能 如何提升代碼性能

如何優(yōu)化JAVA代碼及提高執(zhí)行效率

可供程序利用的資源(內(nèi)存、CPU時(shí)間、網(wǎng)絡(luò)帶寬等)是有限的,優(yōu)化的目的就是讓程序用盡可能少的資源完成預(yù)定的任務(wù)。優(yōu)化通常包含兩方面的內(nèi)容:減小代碼的體積,提高代碼的運(yùn)行效率。本文討論的主要是如何提高代碼的效率。

為江源等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及江源網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、江源網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

在Java程序中,性能問題的大部分原因并不在于Java語言,而是在于程序本身。養(yǎng)成好的代碼編寫習(xí)慣非常重要,比如正確地、巧妙地運(yùn)用java.lang.String類和java.util.Vector類,它能夠顯著地提高程序的性能。下面我們就來具體地分析一下這方面的問題。

1、 盡量指定類的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%

2、 盡量重用對象。特別是String 對象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)用StringBuffer 代替。由于系統(tǒng)不僅要花時(shí)間生成對象,以后可能還需花時(shí)間對這些對象進(jìn)行垃圾回收和處理。因此,生成過多的對象將會(huì)給程序的性能帶來很大的影響。

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

4、 不要重復(fù)初始化變量 默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí),

Java會(huì)把變量初始化成確定的值:所有的對象被設(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è)對象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。

5、 在JAVA + ORACLE 的應(yīng)用系統(tǒng)開發(fā)中,java中內(nèi)嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。

6、 Java 編程過程中,進(jìn)行數(shù)據(jù)庫連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,即使關(guān)閉以釋放資源。因?yàn)閷@些大對象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,會(huì)導(dǎo)致嚴(yán)重的后果。

7、 由于JVM的有其自身的GC機(jī)制,不需要程序開發(fā)者的過多考慮,從一定程度上減輕了開發(fā)者負(fù)擔(dān),但同時(shí)也遺漏了隱患,過分的創(chuàng)建對象會(huì)消耗系統(tǒng)的大量內(nèi)存,嚴(yán)重時(shí)會(huì)導(dǎo)致內(nèi)存泄露,因此,保證過期對象的及時(shí)回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC并非十分的機(jī)智,即使對象滿足了垃圾回收的條件也不一定會(huì)被立即回收。所以,建議我們在對象使用完畢,應(yīng)手動(dòng)置成null。

8、 在使用同步機(jī)制時(shí),應(yīng)盡量使用方法同步代替代碼塊同步。

9、 盡量減少對變量的重復(fù)計(jì)算

例如:for(int i = 0;i list.size; i ++) {

}

應(yīng)替換為:

for(int i = 0,int len = list.size();i len; i ++) {

}

10、盡量采用lazy loading 的策略,即在需要的時(shí)候才開始創(chuàng)建。

例如: String str = “aaa”;

if(i == 1) {

list.add(str);

}

應(yīng)替換為:

if(i == 1) {

String str = “aaa”;

list.add(str);

}

11、慎用異常

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

12、不要在循環(huán)中使用:

Try {

} catch() {

}

應(yīng)把其放置在最外層。

13、StringBuffer 的使用:

StringBuffer表示了可變的、可寫的字符串。

有三個(gè)構(gòu)造方法 :

StringBuffer (); //默認(rèn)分配16個(gè)字符的空間

StringBuffer (int size); //分配size個(gè)字符的空間

StringBuffer (String str); //分配16個(gè)字符+str.length()個(gè)字符空間

你可以通過StringBuffer的構(gòu)造函數(shù)來設(shè)定它的初始化容量,這樣可以明顯地提升性能。這里提到的構(gòu)造函數(shù)是StringBuffer(int

length),length參數(shù)表示當(dāng)前的StringBuffer能保持的字符數(shù)量。你也可以使用ensureCapacity(int

minimumcapacity)方法在StringBuffer對象創(chuàng)建之后設(shè)置它的容量。首先我們看看StringBuffer的缺省行為,然后再找出一條更好的提升性能的途徑。

StringBuffer在內(nèi)部維護(hù)一個(gè)字符數(shù)組,當(dāng)你使用缺省的構(gòu)造函數(shù)來創(chuàng)建StringBuffer對象的時(shí)候,因?yàn)闆]有設(shè)置初始化字符長度,StringBuffer的容量被初始化為16個(gè)字符,也就是說缺省容量就是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)。無論何事只要StringBuffer到達(dá)它的最大容量它就不得不創(chuàng)建一個(gè)新的字符數(shù)組然后重新將舊字符和新字符都拷貝一遍――這也太昂貴了點(diǎn)。所以總是給StringBuffer設(shè)置一個(gè)合理的初始化容量值是錯(cuò)不了的,這樣會(huì)帶來立竿見影的性能增益。

StringBuffer初始化過程的調(diào)整的作用由此可見一斑。所以,使用一個(gè)合適的容量值來初始化StringBuffer永遠(yuǎn)都是一個(gè)最佳的建議。

14、合理的使用Java類 java.util.Vector。

簡單地說,一個(gè)Vector就是一個(gè)java.lang.Object實(shí)例的數(shù)組。Vector與數(shù)組相似,它的元素可以通過整數(shù)形式的索引訪問。但是,Vector類型的對象在創(chuàng)建之后,對象的大小能夠根據(jù)元素的增加或者刪除而擴(kuò)展、縮小。請考慮下面這個(gè)向Vector加入元素的例子:

Object obj = new Object();

Vector v = new Vector(100000);

for(int I=0;

I100000; I++) { v.add(0,obj); }

除非有絕對充足的理由要求每次都把新元素插入到Vector的前面,否則上面的代碼對性能不利。在默認(rèn)構(gòu)造函數(shù)中,Vector的初始存儲能力是10個(gè)元素,如果新元素加入時(shí)存儲能力不足,則以后存儲能力每次加倍。Vector類就象StringBuffer類一樣,每次擴(kuò)展存儲能力時(shí),所有現(xiàn)有的元素都要復(fù)制到新的存儲空間之中。下面的代碼片段要比前面的例子快幾個(gè)數(shù)量級:

Object obj = new Object();

Vector v = new Vector(100000);

for(int I=0; I100000; I++) { v.add(obj); }

同樣的規(guī)則也適用于Vector類的remove()方法。由于Vector中各個(gè)元素之間不能含有“空隙”,刪除除最后一個(gè)元素之外的任意其他元素都導(dǎo)致被刪除元素之后的元素向前移動(dòng)。也就是說,從Vector刪除最后一個(gè)元素要比刪除第一個(gè)元素“開銷”低好幾倍。

假設(shè)要從前面的Vector刪除所有元素,我們可以使用這種代碼:

for(int I=0; I100000; I++)

{

 v.remove(0);

}

但是,與下面的代碼相比,前面的代碼要慢幾個(gè)數(shù)量級:

for(int I=0; I100000; I++)

{

 v.remove(v.size()-1);

}

從Vector類型的對象v刪除所有元素的最好方法是:

v.removeAllElements();

假設(shè)Vector類型的對象v包含字符串“Hello”??紤]下面的代碼,它要從這個(gè)Vector中刪除“Hello”字符串:

String s = "Hello";

int i = v.indexOf(s);

if(I != -1) v.remove(s);

這些代碼看起來沒什么錯(cuò)誤,但它同樣對性能不利。在這段代碼中,indexOf()方法對v進(jìn)行順序搜索尋找字符串“Hello”,remove(s)方法也要進(jìn)行同樣的順序搜索。改進(jìn)之后的版本是:

String s = "Hello";

int i = v.indexOf(s);

if(I != -1) v.remove(i);

這個(gè)版本中我們直接在remove()方法中給出待刪除元素的精確索引位置,從而避免了第二次搜索。一個(gè)更好的版本是:

String s = "Hello"; v.remove(s);

最后,我們再來看一個(gè)有關(guān)Vector類的代碼片段:

for(int I=0; I++;I v.length)

如果v包含100,000個(gè)元素,這個(gè)代碼片段將調(diào)用v.size()方法100,000次。雖然size方法是一個(gè)簡單的方法,但它仍舊需要一次方法調(diào)用的開銷,至少JVM需要為它配置以及清除堆棧環(huán)境。在這里,for循環(huán)內(nèi)部的代碼不會(huì)以任何方式修改Vector類型對象v的大小,因此上面的代碼最好改寫成下面這種形式:

int size = v.size(); for(int I=0; I++;Isize)

雖然這是一個(gè)簡單的改動(dòng),但它仍舊贏得了性能。畢竟,每一個(gè)CPU周期都是寶貴的。

15、當(dāng)復(fù)制大量數(shù)據(jù)時(shí),使用System.arraycopy()命令。

16、代碼重構(gòu):增強(qiáng)代碼的可讀性。

例如:

public class ShopCart {

private List carts ;

public void add (Object item) {

if(carts == null) {

carts = new ArrayList();

}

crts.add(item);

}

public void remove(Object item) {

if(carts. contains(item)) {

carts.remove(item);

}

}

public List getCarts() {

//返回只讀列表

return Collections.unmodifiableList(carts);

}

//不推薦這種方式

//this.getCarts().add(item);

}

17、不用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è)對象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會(huì)調(diào)用任何類構(gòu)造函數(shù)。

在使用設(shè)計(jì)模式(Design Pattern)的場合,如果用Factory模式創(chuàng)建對象,則改用clone()方法創(chuàng)建新的對象實(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();

}

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

18、乘法和除法

考慮下面的代碼:

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

19、在JSP頁面中關(guān)閉無用的會(huì)話。

一個(gè)常見的誤解是以為session在有客戶端訪問時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語句時(shí)才被創(chuàng)建,注意如果JSP沒有顯示的使用 %@pagesession="false"% 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語句HttpSession

session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。由于session會(huì)消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。

對于那些無需跟蹤會(huì)話狀態(tài)的頁面,關(guān)閉自動(dòng)創(chuàng)建的會(huì)話可以節(jié)省一些資源。使用如下page指令:%@ page session="false"%

20、JDBC與I/O

如果應(yīng)用程序需要訪問一個(gè)規(guī)模很大的數(shù)據(jù)集,則應(yīng)當(dāng)考慮使用塊提取方式。默認(rèn)情況下,JDBC每次提取32行數(shù)據(jù)。舉例來說,假設(shè)我們要遍歷一個(gè)5000行的記錄集,JDBC必須調(diào)用數(shù)據(jù)庫157次才能提取到全部數(shù)據(jù)。如果把塊大小改成512,則調(diào)用數(shù)據(jù)庫的次數(shù)將減少到10次。

[p][/p]21、Servlet與內(nèi)存使用

許多開發(fā)者隨意地把大量信息保存到用戶會(huì)話之中。一些時(shí)候,保存在會(huì)話中的對象沒有及時(shí)地被垃圾回收機(jī)制回收。從性能上看,典型的癥狀是用戶感到系統(tǒng)周期性地變慢,卻又不能把原因歸于任何一個(gè)具體的組件。如果監(jiān)視JVM的堆空間,它的表現(xiàn)是內(nèi)存占用不正常地大起大落。

解決這類內(nèi)存問題主要有二種辦法。第一種辦法是,在所有作用范圍為會(huì)話的Bean中實(shí)現(xiàn)HttpSessionBindingListener接口。這樣,只要實(shí)現(xiàn)valueUnbound()方法,就可以顯式地釋放Bean使用的資源。另外一種辦法就是盡快地把會(huì)話作廢。大多數(shù)應(yīng)用服務(wù)器都有設(shè)置會(huì)話作廢間隔時(shí)間的選項(xiàng)。另外,也可以用編程的方式調(diào)用會(huì)話的setMaxInactiveInterval()方法,該方法用來設(shè)定在作廢會(huì)話之前,Servlet容器允許的客戶請求的最大間隔時(shí)間,以秒計(jì)。

22、使用緩沖標(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í)行。頁面級緩沖捕獲對指定URL的請求,并緩沖整個(gè)結(jié)果頁面。對于購物籃、目錄以及門戶網(wǎng)站的主頁來說,這個(gè)功能極其有用。對于這類應(yīng)用,頁面級緩沖能夠保存頁面執(zhí)行的結(jié)果,供后繼請求使用。

23、選擇合適的引用機(jī)制

在典型的JSP應(yīng)用系統(tǒng)中,頁頭、頁腳部分往往被抽取出來,然后根據(jù)需要引入頁頭、頁腳。當(dāng)前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動(dòng)作。

include指令:例如%@ include file="copyright.html"

%。該指令在編譯時(shí)引入指定的資源。在編譯之前,帶有include指令的頁面和指定的資源被合并成一個(gè)文件。被引用的外部資源在編譯時(shí)就確定,比運(yùn)行時(shí)才確定資源更高效。

include動(dòng)作:例如jsp:include page="copyright.jsp"

/。該動(dòng)作引入指定頁面執(zhí)行后生成的結(jié)果。由于它在運(yùn)行時(shí)完成,因此對輸出結(jié)果的控制更加靈活。但時(shí),只有當(dāng)被引用的內(nèi)容頻繁地改變時(shí),或者在對主頁面的請求沒有出現(xiàn)之前,被引用的頁面無法確定時(shí),使用include動(dòng)作才合算。

24、及時(shí)清除不再需要的會(huì)話

為了清除不再活動(dòng)的會(huì)話,許多應(yīng)用服務(wù)器都有默認(rèn)的會(huì)話超時(shí)時(shí)間,一般為30分鐘。當(dāng)應(yīng)用服務(wù)器需要保存更多會(huì)話時(shí),如果內(nèi)存容量不足,操作系統(tǒng)會(huì)把部分內(nèi)存數(shù)據(jù)轉(zhuǎn)移到磁盤,應(yīng)用服務(wù)器也可能根據(jù)“最近最頻繁使用”(Most

Recently

Used)算法把部分不活躍的會(huì)話轉(zhuǎn)儲到磁盤,甚至可能拋出“內(nèi)存不足”異常。在大規(guī)模系統(tǒng)中,串行化會(huì)話的代價(jià)是很昂貴的。當(dāng)會(huì)話不再需要時(shí),應(yīng)當(dāng)及時(shí)調(diào)用HttpSession.invalidate()方法清除會(huì)話。HttpSession.invalidate()方法通??梢栽趹?yīng)用的退出頁面調(diào)用。

25、不要將數(shù)組聲明為:public static final 。

26、HashMap的遍歷效率討論

經(jīng)常遇到對HashMap中的key和value值對的遍歷操作,有如下兩種方法:MapString, String[] paraMap = new HashMapString, String[]();

................//第一個(gè)循環(huán)

SetString appFieldDefIds = paraMap.keySet();

for (String appFieldDefId : appFieldDefIds) {

String[] values = paraMap.get(appFieldDefId);

......

}

//第二個(gè)循環(huán)

for(EntryString, String[] entry : paraMap.entrySet()){

String appFieldDefId = entry.getKey();

String[] values = entry.getValue();

.......

}

第一種實(shí)現(xiàn)明顯的效率不如第二種實(shí)現(xiàn)。

分析如下 SetString appFieldDefIds = paraMap.keySet(); 是先從HashMap中取得keySet

代碼如下:

public SetK keySet() {

SetK ks = keySet;

return (ks != null ? ks : (keySet = new KeySet()));

}

private class KeySet extends AbstractSetK {

public IteratorK iterator() {

return newKeyIterator();

}

public int size() {

return size;

}

public boolean contains(Object o) {

return containsKey(o);

}

public boolean remove(Object o) {

return HashMap.this.removeEntryForKey(o) != null;

}

public void clear() {

HashMap.this.clear();

}

}

其實(shí)就是返回一個(gè)私有類KeySet, 它是從AbstractSet繼承而來,實(shí)現(xiàn)了Set接口。

再來看看for/in循環(huán)的語法

for(declaration : expression_r)

statement

在執(zhí)行階段被翻譯成如下各式

for(IteratorE #i = (expression_r).iterator(); #i.hashNext();){

declaration = #i.next();

statement

}

因此在第一個(gè)for語句for (String appFieldDefId : appFieldDefIds) 中調(diào)用了HashMap.keySet().iterator() 而這個(gè)方法調(diào)用了newKeyIterator()

IteratorK newKeyIterator() {

return new KeyIterator();

}

private class KeyIterator extends HashIteratorK {

public K next() {

return nextEntry().getKey();

}

}

所以在for中還是調(diào)用了

在第二個(gè)循環(huán)for(EntryString, String[] entry : paraMap.entrySet())中使用的Iterator是如下的一個(gè)內(nèi)部類

private class EntryIterator extends HashIteratorMap.EntryK,V {

public Map.EntryK,V next() {

return nextEntry();

}

}

此時(shí)第一個(gè)循環(huán)得到key,第二個(gè)循環(huán)得到HashMap的Entry

效率就是從循環(huán)里面體現(xiàn)出來的第二個(gè)循環(huán)此致可以直接取key和value值

而第一個(gè)循環(huán)還是得再利用HashMap的get(Object key)來取value值

現(xiàn)在看看HashMap的get(Object key)方法

public V get(Object key) {

Object k = maskNull(key);

int hash = hash(k);

int i = indexFor(hash, table.length); //Entry[] table

EntryK,V e = table;

while (true) {

if (e == null)

return null;

if (e.hash == hash eq(k, e.key))

return e.value;

e = e.next;

}

}

其實(shí)就是再次利用Hash值取出相應(yīng)的Entry做比較得到結(jié)果,所以使用第一中循環(huán)相當(dāng)于兩次進(jìn)入HashMap的Entry中

而第二個(gè)循環(huán)取得Entry的值之后直接取key和value,效率比第一個(gè)循環(huán)高。其實(shí)按照Map的概念來看也應(yīng)該是用第二個(gè)循環(huán)好一點(diǎn),它本來就是key和value的值對,將key和value分開操作在這里不是個(gè)好選擇。

北大青鳥java培訓(xùn):Java性能調(diào)優(yōu)的使用技巧有哪些?

對于很多學(xué)習(xí)開發(fā)的人員來說,進(jìn)行性能優(yōu)化是一個(gè)非常復(fù)雜的問題,并且還需要大量的經(jīng)驗(yàn)和知識積累。

想要優(yōu)化達(dá)到一定的效果是一件非常不容易的事情,很多人認(rèn)為需要在經(jīng)驗(yàn)非常豐富的情況下才能使用,其實(shí)在沒有獲得豐富經(jīng)驗(yàn)和知識之前也是可能進(jìn)行性能優(yōu)化的,山西電腦培訓(xùn)認(rèn)為只要掌握一定的方法和技巧就能創(chuàng)建出性能良好的程序。

在進(jìn)行性能調(diào)優(yōu)的過程中,主要是基于Java語言,但是也有一些是可以使用在應(yīng)用程序和編程語言中。

那么在使用之前,山西IT培訓(xùn)為大家一起討論通用的性能調(diào)優(yōu)技巧。

1、先不要急著優(yōu)化在必要之前,一定不要急著進(jìn)行優(yōu)化,這是一種非常重要的性能調(diào)優(yōu)方法。

在進(jìn)行調(diào)優(yōu)過程中,我們應(yīng)該遵守最佳的實(shí)踐方法,這樣才能得到有效的實(shí)現(xiàn)。

但是在使用過程中并不意味著需要證明必要性,最好的方法是使用標(biāo)準(zhǔn)庫或是構(gòu)建復(fù)雜進(jìn)行優(yōu)化。

在很多情況下,如果過早的進(jìn)行優(yōu)化會(huì)占用很大一部分的時(shí)間,還會(huì)出現(xiàn)代碼不好讀取和維護(hù)的情況。

如果更嚴(yán)重,這樣的優(yōu)化是不會(huì)帶來任何好處的,很多時(shí)候你花費(fèi)大量時(shí)間進(jìn)行優(yōu)化的程序并非是最關(guān)鍵的地方。

2、使用分析器找到瓶頸在確定應(yīng)用程序的某些部分需要優(yōu)化的時(shí)候,應(yīng)從哪里進(jìn)行入手呢?解決這種情況主要有兩種方法,山西IT培訓(xùn)認(rèn)為首先就是了解代碼,找出看上去存在問題和可能產(chǎn)生疑惑的地方開始優(yōu)化。

其次是可以使用分析器進(jìn)行優(yōu)化,分析器能夠獲取代碼中每個(gè)部分的性能詳細(xì)信息。

3、為應(yīng)用程序創(chuàng)建測試套件這個(gè)一種能夠幫助你避免很多問題的方法,很多問題主要是發(fā)生在性能部署在生產(chǎn)環(huán)境之后。

在使用過程中,你可以定義測試整個(gè)應(yīng)用程序的套件,這樣就能完成性能改造和運(yùn)行。

在測試運(yùn)行的過程中,能夠幫助你更改功能和性能的影響,這樣才能讓利大于弊。

如果在使用過程中,你的任務(wù)運(yùn)行于多個(gè)應(yīng)用程序的多個(gè)部分,例如數(shù)據(jù)庫、緩存等,這是非常重要的。

進(jìn)行Java性能調(diào)優(yōu)的技巧有很多種,在進(jìn)行性能調(diào)優(yōu)的過程中可以選擇適合自己的方法,在提高應(yīng)用程序的性能中,不需要做大量的工作。

山西電腦培訓(xùn)認(rèn)為最好的方法就是進(jìn)行稍微努力,這樣就能很好的應(yīng)用到代碼中。

北大青鳥設(shè)計(jì)培訓(xùn):Java應(yīng)用的五項(xiàng)性能優(yōu)化技巧?

要想對Java應(yīng)用代碼進(jìn)行優(yōu)化,我們首先需要分析其具體工作原理。

事實(shí)上,影響性能優(yōu)化效果的因素多種多樣,我們需要從垃圾回收、操作系統(tǒng)設(shè)置以及虛擬機(jī)制等多個(gè)角度著眼,方可順利完成任務(wù)。

在今天的文章中,銀川IT培訓(xùn)將分享五項(xiàng)性能優(yōu)化技巧,希望能為你的Java應(yīng)用提升工作帶來啟示。

1.從最小Heap分配入手2.使用各類Java性能工具3.使用StringBuilder而非+運(yùn)算符4.避免使用迭代器5.建立更好的并發(fā)控制機(jī)制

北大青鳥java培訓(xùn):Java性能調(diào)優(yōu)有哪些技巧?

大多數(shù)Java開發(fā)人員都認(rèn)為性能優(yōu)化是復(fù)雜的,需要大量的經(jīng)驗(yàn)和知識。

其實(shí)這樣的說法是有一定的道理的,一般情況下,優(yōu)化應(yīng)用程序以獲得最好的性能不是一件容易的事。

但這并不意味著如果你沒有知識,你什么也做不了,下面廣東電腦培訓(xùn)為大家介紹一些易于遵循的調(diào)整方法。

1、必要之前不要優(yōu)化這可能是最重要的性能調(diào)整之一。

您將要根據(jù)一般的最佳實(shí)踐來高效地實(shí)施用例。

但是,這并不意味著在需要之前,必須更換標(biāo)準(zhǔn)庫或進(jìn)行復(fù)雜的優(yōu)化。

在大多數(shù)情況下,過早的優(yōu)化不僅占用大量的時(shí)間,而且不易讀取代碼,還可以進(jìn)行維護(hù)。

更糟糕的是,廣東IT培訓(xùn)發(fā)現(xiàn)這些優(yōu)化通常不能帶來任何好處,而你花費(fèi)大量時(shí)間進(jìn)行優(yōu)化是應(yīng)用程序的一個(gè)非關(guān)鍵部分。

2、為應(yīng)用程序創(chuàng)建性能這是另一種常用技術(shù),可幫助您避免在生產(chǎn)后發(fā)生的許多意外問題。

廣東IT培訓(xùn)認(rèn)為整個(gè)應(yīng)用程序的性能測試,必須始終定義套件并在性能提高之前和之后運(yùn)行。

3、處理最大的瓶頸創(chuàng)建測試套件并使用分析器分析應(yīng)用程序后,您可以列出需要解決的問題,保證提高性能。

這樣非常好,但我還沒有回答你應(yīng)該從哪里開始的問題。

北大青鳥建議您可以專注于速效系統(tǒng),或從最重要的問題開始。

北大青鳥java培訓(xùn):簡單的Java性能調(diào)優(yōu)技巧?

大多數(shù)JAVA開發(fā)人員理所當(dāng)然地以為性能優(yōu)化很復(fù)雜,需要大量的經(jīng)驗(yàn)和知識。

好吧,不能說這是完全錯(cuò)誤的。

優(yōu)化應(yīng)用程序以獲得最佳性能不是一件容易的事情。

但是,這并不意味著如果你不具備這些知識,就不能做任何事情。

這里有一些易于遵循的調(diào)優(yōu)方式,貴陽java培訓(xùn)建議可以做個(gè)參考!??大部分建議是針對Java的。

但也有若干建議是與語言無關(guān)的,可以應(yīng)用于所有應(yīng)用程序和編程語言。

在討論專門針對Java的性能調(diào)優(yōu)技巧之前,讓我們先來看看通用技巧。

1.在你知道必要之前不要優(yōu)化??這可能是最重要的性能調(diào)整技巧之一。

你應(yīng)該遵循常見的最佳實(shí)踐做法并嘗試高效地實(shí)現(xiàn)用例。

但是,這并不意味著在你證明必要之前,你應(yīng)該更換任何標(biāo)準(zhǔn)庫或構(gòu)建復(fù)雜的優(yōu)化。

在大多數(shù)情況下,過早優(yōu)化不但會(huì)占用大量時(shí)間,而且會(huì)使代碼變得難以閱讀和維護(hù)。

更糟糕的是,這些優(yōu)化通常不會(huì)帶來任何好處,因?yàn)槟慊ㄙM(fèi)大量時(shí)間來優(yōu)化的是應(yīng)用程序的非關(guān)鍵部分。

那么,你如何證明你需要優(yōu)化一些東西呢???首先,你需要定義應(yīng)用程序代碼的速度得多快,例如,為所有API調(diào)用指定最大響應(yīng)時(shí)間,或者指定在特定時(shí)間范圍內(nèi)要導(dǎo)入的記錄數(shù)量。

在完成這些之后,你就可以測量應(yīng)用程序的哪些部分太慢需要改進(jìn)。

然后,接著看第二個(gè)技巧。

2.使用分析器查找真正的瓶頸??在你遵循第一個(gè)建議并確定了應(yīng)用程序的某些部分需要改進(jìn)后,那么從哪里開始呢???你可以用兩種方法來解決問題:??·查看你的代碼,并從看起來可疑或者你覺得可能會(huì)產(chǎn)生問題的部分開始。

·或者使用分析器并獲取有關(guān)代碼每個(gè)部分的行為和性能的詳細(xì)信息。

希望不需要我解釋為什么應(yīng)該始終遵循第二種方法的原因。

很明顯,基于分析器的方法可以讓你更好地理解代碼的性能影響,并使你能夠?qū)W⒂谧铌P(guān)鍵的部分。

如果你曾使用過分析器,那么你一定記得曾經(jīng)你是多么驚訝于一下就找到了代碼的哪些部分產(chǎn)生了性能問題。

老實(shí)說,我第一次的猜測不止一次地導(dǎo)致我走錯(cuò)了方向。

3.為整個(gè)應(yīng)用程序創(chuàng)建性能測試套件??這是另一個(gè)通用技巧,可以幫助你避免在將性能改進(jìn)部署到生產(chǎn)后經(jīng)常會(huì)發(fā)生的許多意外問題。

你應(yīng)該總是定義一個(gè)測試整個(gè)應(yīng)用程序的性能測試套件,并在性能改進(jìn)之前和之后運(yùn)行它。

這些額外的測試運(yùn)行將幫助你識別更改的功能和性能副作用,并確保不會(huì)導(dǎo)致弊大于利的更新。

如果你工作于被應(yīng)用程序若干不同部分使用的組件,如數(shù)據(jù)庫或緩存,那么這一點(diǎn)就尤其重要。

Java性能如何優(yōu)化?

代碼優(yōu)化細(xì)節(jié)

1、盡量指定類、方法的final修飾符

帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String,整個(gè)類都是final的。為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。

如果指定了一個(gè)類為final,則該類所有的方法都是final的。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,內(nèi)聯(lián)對于提升Java運(yùn)行效率作用重大,具體參見Java運(yùn)行期優(yōu)化。此舉能夠使性能平均提高50%。

2、盡量重用對象

特別是String對象的使用,出現(xiàn)字符串連接時(shí)應(yīng)該使用StringBuilder/StringBuffer代替。由于Java虛擬機(jī)不僅要花時(shí)間生成對象,以后可能還需要花時(shí)間對這些對象進(jìn)行垃圾回收和處理,因此,生成過多的對象將會(huì)給程序的性能帶來很大的影響。

3、盡可能使用局部變量

調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧中,速度較快,其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆中創(chuàng)建,速度較慢。另外,棧中創(chuàng)建的變量,隨著方法的運(yùn)行結(jié)束,這些內(nèi)容就沒了,不需要額外的垃圾回收。

4、及時(shí)關(guān)閉流

Java編程過程中,進(jìn)行數(shù)據(jù)庫連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,及時(shí)關(guān)閉以釋放資源。因?yàn)閷@些大對象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,將會(huì)導(dǎo)致嚴(yán)重的后果。

5、盡量減少對變量的重復(fù)計(jì)算

明確一個(gè)概念,對方法的調(diào)用,即使方法中只有一句語句,也是有消耗的,包括創(chuàng)建棧幀、調(diào)用方法時(shí)保護(hù)現(xiàn)場、調(diào)用方法完畢時(shí)恢復(fù)現(xiàn)場等。所以例如下面的操作:

for (int i = 0; i list.size(); i++)

{...}

建議替換為:

for (int i = 0, length = list.size(); i length; i++)

{...}

這樣,在list.size()很大的時(shí)候,就減少了很多的消耗


新聞標(biāo)題:java代碼怎么提高性能 如何提升代碼性能
本文網(wǎng)址:http://weahome.cn/article/dodeoii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部