• 軟件測試技術
  • 軟件測試博客
  • 軟件測試視頻
  • 開源軟件測試技術
  • 軟件測試論壇
  • 軟件測試沙龍
  • 軟件測試資料下載
  • 軟件測試雜志
  • 軟件測試人才招聘
    暫時沒有公告

字號: | 推薦給好友 上一篇 | 下一篇

Java性能

發布: 2008-7-18 10:22 | 作者: 網絡轉載 | 來源: 51testing | 查看: 72次 | 進入軟件測試論壇討論

領測軟件測試網 Java語言特別強調準確性,但可靠的行為要以性能作為代價。這一特點反映在自動收集垃圾、嚴格的運行期檢查、完整的字節碼檢查以及保守的運行期同步等等方面。對一個解釋型的虛擬機來說,由于目前有大量平臺可供挑選,所以進一步阻礙了性能的發揮。

“先做完它,再逐步完善。幸好需要改進的地方通常不會太多!
本附錄的宗旨就是指導大家尋找和優化“需要完善的那一部分”。

D.1 基本方法

只有正確和完整地檢測了程序后,再可著手解決性能方面的問題:

(1) 在現實環境中檢測程序的性能。若符合要求,則目標達到。若不符合,則轉到下一步。
(2) 尋找最致命的性能瓶頸。這也許要求一定的技巧,但所有努力都不會白費。如簡單地猜測瓶頸所在,并試圖進行優化,那么可能是白花時間。
(3) 運用本附錄介紹的提速技術,然后返回步驟1。

為使努力不至白費,瓶頸的定位是至關重要的一環。Donald Knuth[9]曾改進過一個程序,那個程序把50%的時間都花在約4%的代碼量上。在僅一個工作小時里,他修改了幾行代碼,使程序的執行速度倍增。此時,若將時間繼續投入到剩余代碼的修改上,那么只會得不償失。Knuth在編程界有一句名言:“過早的優化是一切麻煩的根源”(Premature optimization is the root of all evil)。最明智的做法是抑制過早優化的沖動,因為那樣做可能遺漏多種有用的編程技術,造成代碼更難理解和操控,并需更大的精力進行維護。

D.2 尋找瓶頸

為找出最影響程序性能的瓶頸,可采取下述幾種方法:

D.2.1 安插自己的測試代碼

插入下述“顯式”計時代碼,對程序進行評測:

long start = System.currentTimeMillis();
// 要計時的運算代碼放在這兒
long time = System.currentTimeMillis() - start;

利用System.out.println(),讓一種不常用到的方法將累積時間打印到控制臺窗口。由于一旦出錯,編譯器會將其忽略,所以可用一個“靜態最終布爾值”(Static final boolean)打開或關閉計時,使代碼能放心留在最終發行的程序里,這樣任何時候都可以拿來應急。盡管還可以選用更復雜的評測手段,但若僅僅為了量度一個特定任務的執行時間,這無疑是最簡便的方法。
System.currentTimeMillis()返回的時間以千分之一秒(1毫秒)為單位。然而,有些系統的時間精度低于1毫秒(如Windows PC),所以需要重復n次,再將總時間除以n,獲得準確的時間。

D.2.2 JDK性能評測[2]

JDK配套提供了一個內建的評測程序,能跟蹤花在每個例程上的時間,并將評測結果寫入一個文件。不幸的是,JDK評測器并不穩定。它在JDK 1.1.1中能正常工作,但在后續版本中卻非常不穩定。
為運行評測程序,請在調用Java解釋器的未優化版本時加上-prof選項。例如:
java_g -prof myClass
或加上一個程序片(Applet):
java_g -prof sun.applet.AppletViewer applet.html
理解評測程序的輸出信息并不容易。事實上,在JDK 1.0中,它居然將方法名稱截短為30字符。所以可能無法區分出某些方法。然而,若您用的平臺確實能支持-prof選項,那么可試試Vladimir Bulatov的“HyperPorf”[3]或者Greg White的“ProfileViewer”來解釋一下結果。

D.2.3 特殊工具

如果想隨時跟上性能優化工具的潮流,最好的方法就是作一些Web站點的?。比如由Jonathan Hardwick制作的“Tools for Optimizing Java”(Java優化工具)網站:
http://www.cs.cmu.edu/~jch/java/tools.html

D.2.4 性能評測的技巧

■由于評測時要用到系統時鐘,所以當時不要運行其他任何進程或應用程序,以免影響測試結果。
■如對自己的程序進行了修改,并試圖(至少在開發平臺上)改善它的性能,那么在修改前后應分別測試一下代碼的執行時間。
■盡量在完全一致的環境中進行每一次時間測試。
■如果可能,應設計一個不依賴任何用戶輸入的測試,避免用戶的不同反應導致結果出現誤差。

D.3 提速方法

現在,關鍵的性能瓶頸應已隔離出來。接下來,可對其應用兩種類型的優化:常規手段以及依賴Java語言。

D.3.1 常規手段

通常,一個有效的提速方法是用更現實的方式重新定義程序。例如,在《Programming Pearls》(編程拾貝)一書中[14],Bentley利用了一段小說數據描寫,它可以生成速度非?、而且非常精簡的拼寫檢查器,從而介紹了Doug McIlroy對英語語言的表述。除此以外,與其他方法相比,更好的算法也許能帶來更大的性能提升——特別是在數據集的尺寸越來越大的時候。欲了解這些常規手段的詳情,請參考本附錄末尾的“一般書籍”清單。

D.3.2 依賴語言的方法

為進行客觀的分析,最好明確掌握各種運算的執行時間。這樣一來,得到的結果可獨立于當前使用的計算機——通過除以花在本地賦值上的時間,最后得到的就是“標準時間”。

運算 示例 標準時間

本地賦值 i=n; 1.0
實例賦值 this.i=n; 1.2
int增值 i++; 1.5
byte增值 b++; 2.0
short增值 s++; 2.0
float增值 f++; 2.0
double增值 d++; 2.0
空循環 while(true) n++; 2.0
三元表達式 (x<0) ?-x : x 2.2
算術調用 Math.abs(x); 2.5
數組賦值 a[0] = n; 2.7
long增值 l++; 3.5
方法調用 funct(); 5.9
throw或catch異常 try{ throw e; }或catch(e){} 320
同步方法調用 synchMehod(); 570
新建對象 new Object(); 980
新建數組 new int[10]; 3100

延伸閱讀

文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/

TAG: java JAVA Java 性能

21/212>

關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97