• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

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

    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.kjueaiud.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認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>