在作性能測試的時候,常常須要去記錄一些方法的執行時間,這期間用到了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