有很多商業的性能測試軟件可供使用,如Jprofiler、JProbe Profiler等,但在開發當中顯得有些遙遠而又昂貴。
2 目標
本文將講述如何利用Java語言本身提供的方法在開發中進行性能測試,找到系統瓶頸,進而改進設計;并且在盡量不修改測試對象的情況下進行測試。
3 預備知識
面向對象編程通過抽象繼承采用模塊化的思想來求解問題域,但是模塊化不能很好的解決所有問題。有時,這些問題可能在多個模塊中都出現,像日志功能,為了記錄每個方法進入和離開時的信息,你不得不在每個方法里添加log("in some method")等信息。如何解決這類問題呢?將這些解決問題的功能點散落在多個模塊中會使冗余增大,并且當很多個功能點出現在一個模塊中時,代碼變的很難維護。因此,AOP(Aspect Oriented Programming)應運而生。如果說OOP(Aobject Oriented Programming)關注的是一個類的垂直結構,那么AOP是從水平角度來看待問題。
動態代理類可以在運行時實現若干接口,每一個動態代理類都有一個Invocation handler對象與之對應,這個對象實現了InvocationHandler接口,通過動態代理的接口對動態代理對象的方法調用會轉而調用Invocation handler對象的invoke方法,通過動態代理實例、方法對象和參數對象可以執行調用并返回結果。
說到AOP,大家首先會想到的是日志記錄、權限檢查和事務管理,是的,AOP是解決這些問題的好辦法。本文根據AOP的思想,通過動態代理來解決一類新的問題——性能測試(performance testing)。
性能測試主要包括以下幾個方面:
計算性能:可能是人們首先關心的,簡單的說就是執行一段代碼所用的時間
內存消耗:程序運行所占用的內存大小
啟動時間:從你啟動程序到程序正常運行的時間
可伸縮性(scalability)
用戶察覺性能(perceived performance):不是程序實際運行有多快,而是用戶感覺程序運行有多快.
本文主要給出了計算性能測試和內存消耗測試的可行辦法。
4 計算性能測試
4.1 目標:
通過該測試可以得到一個方法執行需要的時間
4.2實現:
Java為我們提供了System. currentTimeMillis()方法,可以得到毫秒級的當前時間,我們在以前的程序當中一定也寫過類似的代碼來計算執行某一段代碼所消耗的時間。
longstart=System.currentTimeMillis(); doSth();longend=System.currentTimeMillis(); System.out.println("time lasts"+(end-start)+"ms"); 但是,在每個方法里面都寫上這么一段代碼是一件很枯燥的事情,我們通過Java的java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler利用動態代理來很好的解決上面的問題。
我們要測試的例子是java.util.LinkedList和java.util.ArrayList的get(int index)方法,顯然ArrayList要比LinkedList高效,因為前者是隨機訪問,而后者需要順序訪問。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/