,第一步,就是必需要找出效率最糟的一段程式碼。要如何知道每段程式碼執行花了多久的時間,最簡單測試方式是在每個執行步驟的前後插上旗標與標示時間。
最簡單的方式
使用原生Java的類別,不引用任何既有的framework。大概會是這樣子:package taichitech.helloworld.jse;
public class StopWatchTest {
public static void main(String[] args) {
try {
traditionalStopWatchTest();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void traditionalStopWatchTest() throws Exception {
long start = System.currentTimeMillis();
queryData();
System.out.println("queryData:"+(System.currentTimeMillis()-start));
start=System.currentTimeMillis();//為了要計算下一個動作所花的時間,重新設置起始時間
buildUI();
System.out.println("buildUI:"+(System.currentTimeMillis()-start));
}
}
執行結果: queryData:4000
buildUI:3000
Apache Commons-Lang的StopWatch
OO的好處就是在於不用重覆造輪子。偉大的先賢們已經撰寫出一些很好用的碼錶程式。 Apache commons-lang裡有個StopWatch
class,可以暫時充當一下簡單的碼錶。package taichitech.helloworld.jse;
import org.apache.commons.lang3.time.StopWatch;//Import的是Apache的類別
public class StopWatchTest {
public static void main(String[] args) {
try {
apachStopWatchTest();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void apachStopWatchTest() throws Exception {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
queryData();
System.out.println("queryData:" + stopWatch.toString());
buildUI();
System.out.println("buildUI:" + stopWatch.toString());
stopWatch.stop();
}
}
可以想像這個碼錶有幾個按鈕:start()
、stop()
,這樣來進行操作。其實還有suspend()
、split()
等按鈕,可以做更複雜的應用。執行結果會是這樣子::
queryData:0:00:04.000
buildUI:0:00:07.005
Spring的StopWatch
Apache的StopWatch沒有辦法很直接的記錄每個步驟執行的時間,只能計算到目前為止執行的總時間。我個人比較偏好使用Spring的StopWatch:package taichitech.helloworld.jse;
import org.springframework.util.StopWatch;//Import的是Spring的類別
public class StopWatchTest {
public static void main(String[] args) {
try {
springStopWatchTest();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void springStopWatchTest() throws Exception {
StopWatch sw = new StopWatch("Spring Stop Watch Demostraction");
sw.start("queryData");
queryData();
sw.stop();
sw.start("buildUI");
buildUI();
sw.stop();
System.out.println(sw.prettyPrint());
}
}
執行結果:StopWatch 'Spring Stop Watch Demostraction': running time (millis) = 7001
-----------------------------------------
ms % Task name
-----------------------------------------
04001 057% queryData
03000 043% buildUI
如果一些相關資訊都有填的話,prettyPrint()
印出來的報表其實還蠻美觀的,甚至可以直接拿來當做測試報告交出去。這篇文章簡單的介紹了2個現有的open source 的class,可以供大家在debug時,做時間效能的計算。我個人喜歡用Spring的StopWatch。但是有時候,當在維護舊有系統時,尤其新增jar檔並不是那麼方便的時候,兼且已經匯入Common-Lang framework時,可以考慮採用apache的StopWatch。
沒有留言 :
張貼留言