System.currentTimeMillis突然不香了

System.currentTimeMillis()
在做有些業(yè)務(wù)的時(shí)候,需要記錄該業(yè)務(wù)的執(zhí)行時(shí)間,這時(shí)候想到Date
來記錄處理,也就是常用的System.currentTimeMillis()方法,在代碼塊執(zhí)行前后分別記錄,輸出差值。
Long startTime = System.currentTimeMillis();
//業(yè)務(wù)代碼
Long endTime = System.currentTimeMillis();
System.out.println("本次耗時(shí):" + (endTime - startTime));
當(dāng)當(dāng)看上面的代碼是不是簡單明了,當(dāng)某些情況下,比如小南這次滿屏的System.currentTimeMillis(),閉上眼可以想象滿屏的神獸在心中跑過。如果想做進(jìn)一步控制,一想什么也解決不了。
這時(shí)會想是否有框架會一些法,剛好可以滿足這場景?
StopWatch初始
StopWatch貌似Spring
、Apache
兩個(gè)頂級框架都有。小南用的是Spring
框架中的。
StopWatch 是位于 org.springframework.util 包下的一個(gè)工具類,通過它可方便的對程序部分代碼進(jìn)行計(jì)時(shí)(ms級別),適用于同步單線程代碼塊。
StopWatch使用
想要使用它,需要引入對應(yīng)的包,如Maven 中引入 Spring 核心包,正常情況下我們的項(xiàng)目自動(dòng)引入了該包
StopWatch常見的方法有。

上例子
//建議使用有參可以對任務(wù)分類
StopWatch stopWatch = new StopWatch("統(tǒng)計(jì)模塊任務(wù)執(zhí)行情況");
// 任務(wù)一(1秒)
stopWatch.start("task1");
Thread.sleep(1000 * 1);
System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());
stopWatch.stop();
// 任務(wù)二(2秒)
stopWatch.start("task2");
Thread.sleep(1000 * 2);
stopWatch.stop();
// stop后
System.out.println("stop-currentTaskName:"+stopWatch.currentTaskName());
// 最后一個(gè)任務(wù)的相關(guān)信息
System.out.println("最后一個(gè)任務(wù):" + stopWatch.getLastTaskName());
System.out.println("最后一個(gè)任務(wù):" + stopWatch.getLastTaskTimeMillis());
System.out.println("最后一個(gè)任務(wù):" + JSON.toJSON(stopWatch.getLastTaskInfo()));
//總?cè)蝿?wù)詳情
System.out.println("總耗時(shí):" + stopWatch.getTotalTimeMillis());
System.out.println("總?cè)蝿?wù)數(shù):" + stopWatch.getTaskCount());
System.out.println("所有任務(wù)詳情:" + JSON.toJSON(stopWatch.getTaskInfo()));
//耗時(shí)情況
System.out.println("prettyPrint:"+stopWatch.prettyPrint());
System.out.println("shortSummary:"+stopWatch.shortSummary());
console輸出情況
當(dāng)前任務(wù)名稱:task1
stop-currentTaskName:null
最后一個(gè)任務(wù):task2
最后一個(gè)任務(wù):2013
最后一個(gè)任務(wù):{"taskName":"task2","timeMillis":2013,"timeSeconds":2.013}
總耗時(shí):3024
總?cè)蝿?wù)數(shù):2
所有任務(wù)詳情:[{"taskName":"task1","timeMillis":1011,"timeSeconds":1.011},{"taskName":"task2","timeMillis":2013,"timeSeconds":2.013}]
prettyPrint:StopWatch '統(tǒng)計(jì)模塊任務(wù)執(zhí)行情況': running time (millis) = 3024
-----------------------------------------
ms ? ? % ? ? Task name
-----------------------------------------
01011 ?033% ?task1
02013 ?067% ?task2
shortSummary:StopWatch '統(tǒng)計(jì)模塊任務(wù)執(zhí)行情況': running time (millis) = 3024
總結(jié)
StopWatch沒有使用同步,非線程安全的。
同一個(gè)StopWatch對象,只能運(yùn)行一個(gè)task,再次開啟(start)task任務(wù),必須要停掉(stop)該對象正常使用的task,切記。
若要一次開啟多個(gè),需要new不同的StopWatch實(shí)例
簡單總結(jié)一句,Spring提供的計(jì)時(shí)器StopWatch對于秒、毫秒為單位方便計(jì)時(shí)的程序,尤其是單線程、順序執(zhí)行程序的時(shí)間特性的統(tǒng)計(jì)輸出支持比較好。能夠展示幾個(gè)任務(wù)分別執(zhí)行的時(shí)間,占比狀況等。