Google Prettify

2014-09-20

如何計算每段程式的執行時間?2款簡單好用的碼表程式

在開發系統時,效能尤其是必需注意的。一旦發生了效能上的瓶頸,通常會是會個很大的問題。解決問題的方法
,第一步,就是必需要找出效率最糟的一段程式碼。要如何知道每段程式碼執行花了多久的時間,最簡單測試方式是在每個執行步驟的前後插上旗標與標示時間。

最簡單的方式

使用原生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。

沒有留言 :

您或許對這些有興趣

Related Posts with Thumbnails

最後

謝謝您的閱讀,希望您可以有豐富的收獲。