




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
提高代碼效率的方法提高代碼效率的方法優(yōu)化循環(huán)體
循環(huán)是比較重復運行的地方,如果循環(huán)次數很大,循環(huán)體內不好的代碼對效率的影響就會被放大而變的突出。讓我們看看下面的代碼片:..
Vectorvect=newVector(1000);
...
for(inti=0;i<vect.size();i++){
...
}
for循環(huán)部分改寫成:
intsize=vect.size();
for(inti=0;i<size;i++){
...
}
如果size=1000,就可以減少1000次size()的系統(tǒng)調用開銷,避免了循環(huán)體重復調用。
未優(yōu)化耗時:780309
優(yōu)化后耗時:624430
優(yōu)化循環(huán)體少用NEW初始化一個實例
盡量少用new來初始化一個類的實例,當一個對象是用new進行初始化時,其構造函數鏈的所有構造函數都被調用到,所以new操作符是很消耗系統(tǒng)資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當生成對象后,系統(tǒng)還要花時間進行垃圾回收和處理。
當new創(chuàng)建對象不可避免時,注意避免多次的使用new初始化一個對象。
盡量在使用時再創(chuàng)建該對象。如:
NewObjectobject=newNewObject();
intvalue;
if(i>0)
{
value=object.getValue();
}
修改為: intvalue;
if(i>0)
{
NewObjectobject=newNewObject();
value=object.getValue();
}
另外,應該盡量重復使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變量達到重用的目的。少用NEW初始化一個實例
在Java中,一切都是對象,如果有方法(Method)調用,處理器先要檢查該方法是屬于哪個對象,該對象是否有效,對象屬于什么類型,然后選擇合適的方法并調用。
可以減少方法的調用,同樣一個方法: { inti=0;
...
CallMethod(i);
} publicvoidCallMethod(inti){
if(i==0){
return;
}
...//其他處理
}
可修改為: inti=0;
...
if(i==0){
CallMethod(i);
}
不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。
另外,在方法前加上final,private關鍵字有利于編譯器的優(yōu)化
選擇合適的方法調用
選擇合適的方法調用盡量使用局部變量
調用方法時傳遞的參數以及在調用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進一步優(yōu)化。
例子:publicclassUSER{privateint_sum;privatestaticint_staticSum;voidgetSum(int[]values){for(inti=0;i<values.length;i++){_sum+=values[i];//violation.}}}更正:如果可能,請使用局部變量作為你經常訪問的變量。你可以按下面的方法來修改getSum()方法:voidgetSum(int[]values){intsum=_sum;//temporarylocalvariable.for(inti=0;i<values.length;i++){sum+=values[i];}_sum=sum;}盡量使用局部變量調用方法時傳遞的參數以及在調用中創(chuàng)建的臨時STRING與STRINGBUFFER的使用技巧
1、字符串在JAVA中被廣泛的使用,但是由于String對象是不可改變的,所以如果我們試圖將兩個String對象相加的時候,它實際的執(zhí)行是產生一個中間對象StringBuffer,并調用它的append()法來進行相加的,最后調用StringBufffer的toString()方法來返回一個String的對象,如果只是一般的相加差別不大,但是如果是在循環(huán)中,性能差距就較明顯 注:Strings=“a”+“b”+“c”,實際上在編譯后是Strings=“abc”,執(zhí)行時不存在相加問題
2、在字符串相加的時候,如果該字符串只有一個字符的話如:Stringstr=s+“d”應該換作
string=s+‘d’來執(zhí)行。
3、由于在創(chuàng)建一個StringBuffer對象時,StringBuffer的構造器會創(chuàng)建一個默認大小(通常是16)的字符數組。在使用中,如果超出這個大小,就會重新分配內存,創(chuàng)建一個更大的數組,并將原先的數組復制過來,再丟棄舊的數組。在大多數情況下,如果可以的話,在創(chuàng)建StringBuffer的時候應指定大小,這樣就避免了在容量不夠的時候自動增長,以提高性能。STRING與STRINGBUFFER的使用技巧 1、字符串返回STRING與STRINGBUFFER的使用技巧返回STRING與STRINGBUFFER的使用技巧盡可能的使用JAVA自身提供的API用JAVA自身的System.arraycopy方法明顯省時盡可能的使用JAVA自身提供的API用JAVA自身的Syst不要重復初始化變量
默認情況下,調用類的構造函數時,Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創(chuàng)建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。不要重復初始化變量默認情況下,調用類的構造函數時,Jav避免不需要的造型操作
所有的類都是直接或者間接繼承自Object。同樣,所有的子類也都隱含的“等于”其父類。那么,由子類造型至父類的操作就是不必要的了。例子:classUNC{String_id="UNC";}classDogextendsUNC{voidmethod(){Dogdog=newDog();UNCanimal=(UNC)dog;//notnecessary.Objecto=(Object)dog;//notnecessary.}}
更正:classDogextendsUNC{voidmethod(){Dogdog=newDog();UNCanimal=dog;Objecto=dog;}}避免不需要的造型操作所有的類都是直接或者間接繼承自Obje如果只是查找單個字符的話,用CHARAT()代替STARTSWITH()
用一個字符作為參數調用startsWith()也會工作的很好,但從性能角度上來看,調用charAt更好
例子:publicclassPCTS{privatevoidmethod(Strings){if(s.startsWith("a")){//violation//...}}}
更正將'startsWith()'替換成'charAt()'.publicclassPCTS{privatevoidmethod(Strings){if('a'==s.charAt(0)){//...}}}如果只是查找單個字符的話,用CHARAT()代替STARTS不要在循環(huán)中調用SYNCHRONIZED(同步)方法
方法的同步需要消耗相當大的資源,在一個循環(huán)中調用它絕對不是一個好主意。例子:importjava.util.Vector;publicclassSYN{publicsynchronizedvoidmethod(Objecto){}privatevoidtest(){for(inti=0;i<vector.size();i++){method(vector.elementAt(i));//violation}}privateVectorvector=newVector(5,5);}不要在循環(huán)中調用SYNCHRONIZED(同步)方法方法的不要在循環(huán)中調用SYNCHRONIZED(同步)方法
更正:不要在循環(huán)體中調用同步方法,如果必須同步的話,推薦以下方式:importjava.util.Vector;publicclassSYN{publicvoidmethod(Objecto){}privatevoidtest(){synchronized{//在一個同步塊中執(zhí)行非同步方法
for(inti=0;i<vector.size();i++){method(vector.elementAt(i));}}}privateVectorvector=newVector(5,5);}不要在循環(huán)中調用SYNCHRONIZED(同步)方法更正:ORACLE的SQL語句盡量使用大寫
在JAVA+ORACLE的應用系統(tǒng)開發(fā)中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
ORACLE的SQL語句盡量使用大寫在JAVA+ORA減少I/O操作
盡量減少I/O操作:輸入/輸出(I/O)包括很多方面,我們知道,進行I/O操作是很消耗系統(tǒng)資源的。程序中應該盡量少用I/O操作。使用時可以注意:.合理控制輸出函數System.out.println()對于大多時候是有用的,特別是系統(tǒng)調試的時候,但也會產生大量的信息出現(xiàn)在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。
特別是在發(fā)行版中,要合理的控制輸出,可以在項目開發(fā)時,設計好一個Debug的工具類,在該類中可以實現(xiàn)輸出開關,輸出的級別,根據不同的情況進行不同的輸出的控制。
盡量使用緩存: 讀寫內存要比讀寫硬盤上的文件要快很多,應盡可能使用緩沖,以便直接從內存中讀取數據。
盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader代替Reader,用BufferedWriter代替Writer來進行處理I/O操作。同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高減少I/O操作即時關閉I/O流操作
Java編程過程中,I/O流操作時務必小心,在使用完畢后,及時關閉以釋放資源。因為對這些大對象的操作會造成系統(tǒng)大的開銷,稍有不慎,會導致嚴重的后果。即時關閉I/O流操作
Java編程過程中,I/O流操作在FINALLY塊中關閉STREAM程序中使用到的資源應當被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結果如何,finally塊總是會執(zhí)行的,以確保資源的正確關閉。例子:importjava.io.*;publicclassCS{publicstaticvoidmain(Stringargs[]){CScs=newCS();cs.method();}publicvoidmethod(){try{FileInputStreamfis=newFileInputStream("CS.java");intcount=0;while(fis.read()!=-1)count++;System.out.println(count);fis.close();}catch(FileNotFoundExceptione1){}catch(IOExceptione2){}}}
更正:在最后一個catch后添加一個finally塊在FINALLY塊中關閉STREAM程序中使用到的資源應當被對象使用完畢應手動置成NULL
由于JVM的有其自身的GC機制,不需要程序開發(fā)者的過多考慮,從一定程度上減輕了開發(fā)者負擔,但同時也遺漏了隱患,過分的創(chuàng)建對象會消耗系統(tǒng)的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC并非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。對象使用完畢應手動置成NULL由于JVM的有其自身的GC機慎用異常
異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創(chuàng)建了一個新的對象。異常只能用于錯誤處理,不應該用來控制程序流程。慎用異常異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象。T盡量不要在循環(huán)中使用
TRYCATCHTry{
}catch(){}
如無特殊要求,應把其放置在最外層。
比如數據回滾盡量不要在循環(huán)中使用TRYCATCHTry集合類優(yōu)化問題集合類在此Java編程中被廣泛地使用,一個集合類就是將一組對象組裝成一個對象Java的集合類框架由一些接口(如Collection、List、Set、Map)和一些為通用目的而實現(xiàn)的類(如Vector,ArrayList、Hashtable等等)組成,這些類里,有些提供了某種排序算法,有的提供了同步的方法,有如此多的集合類,在具體使用過程中,我們如何根據自己的需要選擇合適的集合類,將對程序的性能產生很大的影響,下面將一些常用的類進行比較:Vector和ArrayListVector和ArrayList在使用上非常相似,都可用來表示一組數量可變的對象應用的集合,并且可以隨機地訪問其中的元素。它們的區(qū)別如下:1、Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好.2、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣ArrayList就有利于節(jié)約內存空間。Hashtable和HashMap
它們的性能方面的比較類似
Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。當它們中的元素超過它的初始大小時,都會將它的容量翻倍。集合類優(yōu)化問題集合類在此Java編程中被廣泛地使用,一個集合ArrayList和LinkedList
對于處理一列數據項,Java提供了兩個類ArrayList和LinkedList,ArrayList的內部實現(xiàn)是基于內部數組Object[],所以從概念上講,它更象數組,但LinkedList的內部實現(xiàn)是基于一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別。
(1)在ArrayList的前面或中間插入數據時,你必須將其后的所有數據相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能。
(2)訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿著連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。注意:在Java集合框架中的大部分類的大小是可以隨著元素個數的增加而相應的增加的,我們似乎不用關心它的初始大小,但如果我們考慮類的性能問題時,就一定要考慮盡可能地設置好集合對象的初始大小,這將大大提高代碼的性能,比如,Hashtable缺省的初始大小為11,載入因子為0.75,即如果其中的元素個數超過7個,它就必須增加大小并重新組織元素,所以,如果你知道在創(chuàng)建一個新的Hashtable對象時就知道元素的確切數目如為12,那么,就應將其初始大小設為12/0.75=16,這樣,就可以避免重新組織內存并增加大小。(默認VectorArrayList10個大小,Hashtable11,HashMap16)集合類優(yōu)化問題集合類優(yōu)化問題JAVA提高代碼效率的方法ppt課件返回返回不用保存太多的信息在HTTPSESSION中
很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網上商店系統(tǒng)會把購物車信息保存在該用戶的Session中,但當存儲大量的信息或是大的對象在會話中時,是有害的,特別是當系統(tǒng)中用戶的訪問量很大,對內存的需求就會很高。
不用保存太多的信息在HTTPSESSION中
很多時候,存不用保存太多的信息在HTTPSESSION中
清除SESSION: 通常情況,當達到設定的超時時間時,同時有些Session沒有了活動,服務器會釋放這些沒有活動的Session,..不過這種情況下,特別是多用戶并訪時,系統(tǒng)內存要維護多個的無效Session。
當用戶退出時,應該手動釋放,回收資源,實現(xiàn)如下:
HttpSessiontheSession=request.getSession();
//獲取當前Session
if(theSession!=null){
theSession.invalidate();//使該Session失效
}
不用保存太多的信息在HTTPSESSION中在JSP頁面中關閉無用的會話一個常見的誤解是以為session在有客戶端訪問時就被創(chuàng)建,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被創(chuàng)建,注意如果JSP沒有顯示的使用<%@pagesession="false"%>關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC 63297:2025 EN-FR Sensing devices for non-intrusive load monitoring (NILM) systems
- 【正版授權】 IEC 63119-1:2025 EN Information exchange for electric vehicle charging roaming service - Part 1: General
- 華科版五年級信息技術課件
- 海南省小升初數學試卷
- 懷化市高三聯(lián)考數學試卷
- 濟南初三中考數學試卷
- 健康管理學概論課件
- 2024-2030年中國浙江省房地產行業(yè)市場調查研究及投資前景展望報告
- 中國香熏爐行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告(2024-2030)
- 中國櫸木行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告(2024-2030)
- 2025年班組長綜合管理技能競賽理論考試題庫500題(含答案)
- 2024-2025學年四川省成都市錦江區(qū)八年級上學期期末數學試卷(含答案)
- 中試基地建設可行性研究報告
- 光伏發(fā)電建設項目二級安全教育培訓考試試卷(附答案)
- 大學英語四級高頻詞匯1500+六級高頻詞匯1500
- 竣工工程安全評估報告
- 《基礎護理學(第七版)》考前強化模擬練習試題庫500題(含答案)
- 中學教科研課題管理制度
- 叉車司機證考試題庫(含各題型)
- 房屋永久居住權協(xié)議書(2篇)
- 《問診與體格檢查》課件
評論
0/150
提交評論