![2021程序效率_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/22/860d4b42-f77f-4edb-a27f-32e06faad215/860d4b42-f77f-4edb-a27f-32e06faad2151.gif)
![2021程序效率_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/22/860d4b42-f77f-4edb-a27f-32e06faad215/860d4b42-f77f-4edb-a27f-32e06faad2152.gif)
![2021程序效率_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/22/860d4b42-f77f-4edb-a27f-32e06faad215/860d4b42-f77f-4edb-a27f-32e06faad2153.gif)
![2021程序效率_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/22/860d4b42-f77f-4edb-a27f-32e06faad215/860d4b42-f77f-4edb-a27f-32e06faad2154.gif)
![2021程序效率_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/22/860d4b42-f77f-4edb-a27f-32e06faad215/860d4b42-f77f-4edb-a27f-32e06faad2155.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、程序效率通過使用一些輔助性工具來找到程序中的瓶頸,然后就可以對瓶頸部分的代碼進行優(yōu)化。一般有兩種方案:即優(yōu)化代碼或更改設計方法。我們一般會選擇后者,因為不去調用以下代碼要比調用一些優(yōu)化的代碼更能提高程序的性能。而一個設計良好的程序能夠精簡代碼,從而提高性能。下面將提供一些在JAVA程序的設計和編碼中,為了能夠提高JAVA程序的性能,而經(jīng)常采用的一些方法和技巧。1對象的生成和大小的調整。JAVA程序設計中一個普遍的問題就是沒有好好的利用JAVA語言本身提供的函數(shù),從而常常會生成大量的對象(或實例)。由于系統(tǒng)不僅要花時間生成對象,以后可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象
2、將會給程序的性能帶來很大的影響。例1:關于String ,StringBuffer,+和appendJAVA語言提供了對于String類型變量的操作。但如果使用不當,會給程序的性能帶來影響。如下面的語句:String name=new String(HuangWeiFeng);System.out.println(name+is my name);看似已經(jīng)很精簡了,其實并非如此。為了生成二進制的代碼,要進行如下的步驟和操作:(1) 生成新的字符串new String(STR_1);(2) 復制該字符串;(3) 加載字符串常量HuangWeiFeng(STR_2);(4) 調用字符串的構架器(C
3、onstructor);(5) 保存該字符串到數(shù)組中(從位置0開始);(6) 從java.io.PrintStream類中得到靜態(tài)的out變量;(7) 生成新的字符串緩沖變量new StringBuffer(STR_BUF_1);(8) 復制該字符串緩沖變量;(9) 調用字符串緩沖的構架器(Constructor);(10) 保存該字符串緩沖到數(shù)組中(從位置1開始);(11) 以STR_1為參數(shù),調用字符串緩沖(StringBuffer)類中的append方法;(12) 加載字符串常量is my name(STR_3);(13) 以STR_3為參數(shù),調用字符串緩沖(StringBuffer)類
4、中的append方法;(14) 對于STR_BUF_1執(zhí)行toString命令;(15) 調用out變量中的println方法,輸出結果。由此可以看出,這兩行簡單的代碼,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五個對象變量。這些生成的類的實例一般都存放在堆中。堆要對所有類的超類,類的實例進行初始化,同時還要調用類極其每個超類的構架器。而這些操作都是非常消耗系統(tǒng)資源的。因此,對對象的生成進行限制,是完全有必要的。經(jīng)修改,上面的代碼可以用如下的代碼來替換。StringBuffer name=new StringBuffer(HuangWeiFeng);System
5、.out.println(name.append(is my name.).toString();系統(tǒng)將進行如下的操作:(1) 生成新的字符串緩沖變量new StringBuffer(STR_BUF_1);(2) 復制該字符串緩沖變量;(3) 加載字符串常量HuangWeiFeng(STR_1);(4) 調用字符串緩沖的構架器(Constructor);(5) 保存該字符串緩沖到數(shù)組中(從位置1開始);(6) 從java.io.PrintStream類中得到靜態(tài)的out變量;(7) 加載STR_BUF_1;(8) 加載字符串常量is my name(STR_2);(9) 以STR_2為參數(shù),調
6、用字符串緩沖(StringBuffer)實例中的append方法;(10) 對于STR_BUF_1執(zhí)行toString命令(STR_3);(11)調用out變量中的println方法,輸出結果。由此可以看出,經(jīng)過改進后的代碼只生成了四個對象變量:STR_1,STR_2,STR_3和STR_BUF_1.你可能覺得少生成一個對象不會對程序的性能有很大的提高。但下面的代碼段2的執(zhí)行速度將是代碼段1的2倍。因為代碼段1生成了八個對象,而代碼段2只生成了四個對象。代碼段1:String name= new StringBuffer(HuangWeiFeng);name+=is my;name+=name
7、;代碼段2:StringBuffer name=new StringBuffer(HuangWeiFeng);name.append(is my);name.append(name.).toString();因此,充分的利用JAVA提供的庫函數(shù)來優(yōu)化程序,對提高JAVA程序的性能時非常重要的.其注意點主要有如下幾方面;(1) 盡可能的使用靜態(tài)變量(Static Class Variables)如果類中的變量不會隨他的實例而變化,就可以定義為靜態(tài)變量,從而使他所有的實例都共享這個變量。例:public class fooSomeObject so=new SomeObject();就可以定義為:
8、public class foostatic SomeObject so=new SomeObject();(2) 不要對已生成的對象作過多的改變。對于一些類(如:String類)來講,寧愿在重新生成一個新的對象實例,而不應該修改已經(jīng)生成的對象實例。例:String name=Huang;name=Wei;name=Feng;上述代碼生成了三個String類型的對象實例。而前兩個馬上就需要系統(tǒng)進行垃圾回收處理。如果要對字符串進行連接的操作,性能將得更差,因為系統(tǒng)將不得為此生成更多得臨時變量,如上例1所示。(3) 生成對象時,要分配給它合理的空間和大小JAVA中的很多類都有它的默認的空間分配大小
9、。對于StringBuffer類來講,默認的分配空間大小是16個字符。如果在程序中使用StringBuffer的空間大小不是16個字符,那么就必須進行正確的初始化。(4) 避免生成不太使用或生命周期短的對象或變量。對于這種情況,因該定義一個對象緩沖池。以為管理一個對象緩沖池的開銷要比頻繁的生成和回收對象的開銷小的多。(5) 只在對象作用范圍內進行初始化。JAVA允許在代碼的任何地方定義和初始化對象。這樣,就可以只在對象作用的范圍內進行初始化。從而節(jié)約系統(tǒng)的開銷。例:SomeObject so=new SomeObject();If(x=1) thenFoo=so.getXX();可以修改為:i
10、f(x=1) thenSomeObject so=new SomeObject();Foo=so.getXX();2異常(Exceptions)JAVA語言中提供了try/catch來發(fā)方便用戶捕捉異常,進行異常的處理。但是如果使用不當,也會給JAVA程序的性能帶來影響。因此,要注意以下兩點:(1) 避免對應用程序的邏輯使用try/catch如果可以用if,while等邏輯語句來處理,那么就盡可能的不用try/catch語句。(2) 重用異常在必須要進行異常的處理時,要盡可能的重用已經(jīng)存在的異常對象。以為在異常的處理中,生成一個異常對象要消耗掉大部分的時間。3. 線程(Threading)一個
11、高性能的應用程序中一般都會用到線程。因為線程能充分利用系統(tǒng)的資源。在其他線程因為等待硬盤或網(wǎng)絡讀寫而時,程序能繼續(xù)處理和運行。但是對線程運用不當,也會影響程序的性能。例2:正確使用Vector類Vector主要用來保存各種類型的對象(包括相同類型和不同類型的對象)。但是在一些情況下使用會給程序帶來性能上的影響。這主要是由Vector類的兩個特點所決定的。第一,Vector提供了線程的安全保護功能。即使Vector類中的許多方法同步。但是如果你已經(jīng)確認你的應用程序是單線程,這些方法的同步就完全不必要了。第二,在Vector查找存儲的各種對象時,常常要花很多的時間進行類型的匹配。而當這些對象都是同
12、一類型時,這些匹配就完全不必要了。因此,有必要設計一個單線程的,保存特定類型對象的類或集合來替代Vector 類.用來替換的程序如下(StringVector.java):public class StringVectorprivate String data;private int count;public StringVector()this(10); / default size is 10public StringVector(int initialSize)data = new StringinitialSize;public void add(String str)/ ignore
13、 null stringsif(str = null) return; ensureCapacity(count + 1);datacount+ = str;private void ensureCapacity(int minCapacity)int oldCapacity = data.length;if (minCapacity oldCapacity)String oldData = data;int newCapacity = oldCapacity * 2;data = new StringnewCapacity;System.arraycopy(oldData, 0, data,
14、 0, count);public void remove(String str)if(str = null) return; / ignore null str for(int i = 0; i / check for a matchif(datai.equals(str)System.arraycopy(data,i+1,data,i,count-1); / copy data/ allow previously valid array element be gcddata-count = null;return;public final String getStringAt(int in
15、dex)if(index else if(index count) return null; / index is # strings else return dataindex; / index is good 因此,代碼:Vector Strings=new Vector();Strings.add(One);Strings.add(Two);String Second=(String)Strings.elementAt(1);可以用如下的代碼替換:StringVector Strings=new StringVector();Strings.add(One);Strings.add(Tw
16、o);String Second=Strings.getStringAt(1);這樣就可以通過優(yōu)化線程來提高JAVA程序的性能。用于測試的程序如下(TestCollection.java):import java.util.Vector;public class TestCollectionpublic static void main(String args )TestCollection collect = new TestCollection();if(args.length = 0)System.out.println(Usage: java TestCollection vector
17、 | stringvector );System.exit(1);if(args0.equals(vector)Vector store = new Vector();long start = System.currentTimeMillis();for(int i = 0; i store.addElement(string);long finish = System.currentTimeMillis();System.out.println(finish-start);start = System.currentTimeMillis();for(int i = 0; i String r
18、esult = (String)store.elementAt(i);finish = System.currentTimeMillis();System.out.println(finish-start);else if(args0.equals(stringvector)StringVector store = new StringVector();long start = System.currentTimeMillis();for(int i = 0; i long finish = System.currentTimeMillis();System.out.println(finis
19、h-start);start = System.currentTimeMillis();for(int i = 0; i String result = store.getStringAt(i);finish = System.currentTimeMillis();System.out.println(finish-start);關于線程的操作,要注意如下幾個方面:(1) 防止過多的同步如上所示,不必要的同步常常會造成程序性能的下降。因此,如果程序是單線程,則一定不要使用同步。(2) 同步方法而不要同步整個代碼段對某個方法或函數(shù)進行同步比對整個代碼段進行同步的性能要好。(3) 對每個對象使用
20、多”鎖”的機制來增大并發(fā)。一般每個對象都只有一個”鎖”,這就表明如果兩個線程執(zhí)行一個對象的兩個不同的同步方法時,會發(fā)生”死鎖”。即使這兩個方法并不共享任何資源。為了避免這個問題,可以對一個對象實行”多鎖”的機制。如下所示:class fooprivate static int var1;private static Object lock1=new Object();private static int var2;private static Object lock2=new Object();public static void increment1()synchronized(lock1)var1+;public static void increment2()synchronized(lock2)var2+;4輸入和輸出(I/O)輸入和輸出包括很多方面,但涉及最多的是對硬盤,網(wǎng)絡或數(shù)據(jù)庫的讀寫操作。對于讀寫操作,又分為有緩存和沒有緩存的;對于數(shù)據(jù)庫的操作,又可以有多種類型的JDBC驅動器可以選擇。但無論怎樣,都會給程序的性能帶來影響。因此,需要注意如下幾點:(1) 使用輸入輸出緩沖盡可能的多
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型起重機專利許可及銷售代理合同
- 合作房地產(chǎn)開發(fā)協(xié)議(28篇)
- 師傅和徒弟作文
- 2025年兼職工勞務合同格式
- 2025年企業(yè)合作投資與合資合同
- 2025年信用卡預借現(xiàn)金協(xié)議書范本
- 2025年中尺度自動氣象站系統(tǒng)項目立項申請報告
- 2025年區(qū)域飲品代理合作協(xié)議范本
- 2025年式多功能打印機銷售合同規(guī)范
- 2025年企業(yè)電力安全使用標準協(xié)議書
- 《跟著音樂去旅行》課件
- 初中數(shù)學深度學習與核心素養(yǎng)探討
- 特殊教育導論 課件 第1-6章 特殊教育的基本概念-智力異常兒童的教育
- 辭職申請表-中英文模板
- 07J501-1鋼雨篷玻璃面板圖集
- 2023學年完整公開課版家鄉(xiāng)的方言
- 母親健康快車可行性報告
- 護理質量管理課件
- 出口貨物報關單英文翻譯
- 消防安全開學第一課
- 顱腦外傷(新版)課件
評論
0/150
提交評論