一個時間計數器timewatch輔助性能測試

在作性能測試的時候,常常須要去記錄一些方法的執行時間,這期間用到了stopwatch的類,可是有些功能自定義起來不太好,好比自定義標記的名稱一類,並且split方法也有點不順手,因此產生了本身寫一個簡單的時間計數器。java

語言使用groovy寫的,java框架可使用。git

v1.0已經完成,目前只有一些簡單的功能,下一步打算弄一下多線程使用兼容問題。api

package com.fun.utils

import com.fun.frame.SourceCode
import org.slf4j.LoggerFactory

import java.text.DecimalFormat

/**
 * 時間觀察者類,用於簡單記錄執行時間
 */
class TimeWatch extends SourceCode {
    static def logger = LoggerFactory.getLogger(TimeWatch.class)
/**
 * 默認的名稱
 */
    def name = "default"
/**
 * 納秒
 */
    def startTime
    /**
     * 標記集合
     */
    def marks = new HashMap<String, Mark>()
    /**
     * 毫秒
     */
    def startTimeMillis

/**
 * 無參建立方法,默認名稱
 * @return
 */
    public static TimeWatch create() {
        final TimeWatch timeWatch = new TimeWatch()
        timeWatch.start()
        return timeWatch
    }

/**
 * 建立方法
 * @param name
 * @return
 */
    public static TimeWatch create(def name) {
        final TimeWatch timeWatch = new TimeWatch()
        timeWatch.start()
        return timeWatch
    }


    private TimeWatch() {
    }

/**
 * 開始記錄
 * @return
 */
    def start() {
       reset()
    }

/**
 * 重置
 */
    def reset() {
        startTime = getNanoMark()
        startTimeMillis = Time.getTimeStamp()
    }
/**
 * 標記
 * @param name
 * @return
 */
    def mark(def name) {
        marks.put(name, new Mark(name))
    }

/**
 * 標記
 * @return
 */
    def mark() {
        marks.put(name, new Mark(name))
    }

/**
 * 獲取標記時間
 * @return
 */
    def getMarkTime() {
        if (marks.containsKey(name)) {
            def diff = Time.getTimeStamp() - marks.get(name).getStartTimeMillis()
            logger.info(LINE + "觀察者:{}的標記:{}記錄時間:{} ms", name, name, diff)
        } else {
            logger.warn("沒有默認標記!")
        }
    }

/**
 * 獲取標記時間
 * @return
 */
    def getMarkNanoTime() {
        if (marks.containsKey(name)) {
            def diff = getNanoMark() - marks.get(name).getStartTime()
            logger.info(LINE + "觀察者:{}的標記:{}記錄時間:{} ns", name, name, diff)
        } else {
            logger.warn("沒有默認標記!")
        }
    }


/**
 * 獲取某個標記的記錄時間
 * @param name
 * @return
 */
    def getMarkTime(String name) {
        if (marks.containsKey(name)) {
            def diff = Time.getTimeStamp() - marks.get(name).getStartTimeMillis()
            logger.info(LINE + "觀察者:{}的標記:{}記錄時間:{} ms", name, name, diff)
        } else {
            logger.warn("沒有{}標記!", name)
        }
    }

/**
 * 獲取某個標記的記錄時間
 * @param name
 * @return
 */
    def getMarkNanoTime(String name) {
        if (marks.containsKey(name)) {
            def diff = getNanoMark() - marks.get(name).getStartTime()
            logger.info(LINE + "觀察者:{}的標記:{}記錄時間:{} ns", name, name, diff)
        } else {
            logger.warn("沒有{}標記!", name)
        }
    }


/**
 * 獲取記錄時間
 * @return
 */
    def getTime() {
        def diff = Time.getTimeStamp() - startTimeMillis
        logger.info(LINE + "觀察者:{},記錄時間:{} ms", getName(), diff)
        return diff
    }

/**
 * 獲取記錄時間納秒
 * @return
 */
    def getNanoTime() {
        long diff = getNanoMark() - startTime
        DecimalFormat format = new DecimalFormat("#,###")
        logger.info(LINE + "觀察者:{},記錄時間:{} ns", getName(), format.format(diff))
        return diff
    }

    @Override
    public String toString() {
        return "時間觀察者:" + this.name
    }

    @Override
    public TimeWatch clone() {
        def watch = new TimeWatch()
        watch.name = getName() + "_c"
        watch.startTime = getStartTime()
        watch.startTimeMillis = getStartTimeMillis()
        return watch
    }
/**
 * 標記類
 */
    class Mark {

        public Mark(def name) {
            this.name = name
            reset()
        }

        def name

        def startTime

        def startTimeMillis
        def lastTime
        def l

        def reset() {
            this.startTime = getNanoMark()
            this.startTimeMillis = Time.getTimeStamp()
        }
    }
}
groovy是一種基於JVM的動態語言,我以爲最大的優點有兩點,第一:於java兼容性很是好,大部分時候吧groovy的文件後綴改爲java直接能夠用,反之亦然。java的絕大部分庫,groovy都是能夠直接拿來就用的。這還帶來了另一個有點,學習成本低,很是低,直接上手沒問題,能夠慢慢學習groovy不一樣於Java的語法;第二:編譯器支持變得更好,如今用的intellij的ide,整體來講已經比較好的支持groovy語言了,寫起代碼來也是比較順滑了,各類基於groovy的框架工具也比較溜,特別是Gradle構建工具,比Maven爽不少。----此段文字爲了撐字數強加的,與內容無關。

歡迎有興趣的童鞋一塊兒交流markdown

相關文章
相關標籤/搜索