如何優雅的打印代碼執行時長
System方式 不推薦
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
//...
long endTime = System.currentTimeMillis();
System.out.println("程序運行時間: " (endTime - startTime) "ms");
}
JDK8 處理方式 不推薦
public static void main(String[] args) {
Instant start = Instant.now();
//...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("millis = " duration.toMillis());
System.out.println("程序運行時間: " duration.toMillis() "ms");
}
Commons-lang3的StopWatch 推薦方式
public static void main(String[] args) throws Exception {
StopWatch watch = StopWatch.createStarted(); //創建後立即start,常用
//StopWatch watch = new StopWatch();
//watch.start();
Thread.sleep(1000);
System.out.println("統計從開始到現在運行時間:" watch.getTime() "ms"); //1000ms
Thread.sleep(1000);
watch.split();
System.out.println("從start到此刻爲止的時間:" watch.getTime());
System.out.println("從開始到第一個切入點運行時間:" watch.getSplitTime()); //2245
Thread.sleep(1000);
watch.split();
System.out.println("從開始到第二個切入點運行時間:" watch.getSplitTime());
watch.reset(); //重置後必須使用start方法
watch.start();
Thread.sleep(1000);
System.out.println("重新開始後到當前運行時間是:" watch.getTime()); //1000
watch.suspend(); //暫停
Thread.sleep(6000); //模擬暫停6秒鐘
watch.resume(); //上面suspend,這裏要想重新統計,需要恢復一下
System.out.println("恢復後執行的時間是:" watch.getTime()); //1000 注意此時這個值還是1000
watch.stop();
System.out.println("花費的時間》》" watch.getTime() "ms"); //1002ms
System.out.println("花費的時間》》" watch.getTime(TimeUnit.SECONDS) "s"); //1s 可以直接轉成s
}
打印結果
統計從開始到現在運行時間:1007ms
從start到此刻爲止的時間:2008
從開始到第一個切入點運行時間:2008
從開始到第二個切入點運行時間:3009
重新開始後到當前運行時間是:1000
恢復後執行的時間是:1000
花費的時間》》1001ms
花費的時間》》1s
Spring的StopWatch 推薦方式
public static void main(String[] args) throws Exception {
// 強烈每一個秒錶都給一個id,這樣查看日誌起來能夠更加的精確
// 至於Id 我覺得給UUID是可行的~
StopWatch sw = new StopWatch(UUID.randomUUID().toString());
sw.start("起牀");
Thread.sleep(1000);
System.out.println("當前任務名稱:" sw.currentTaskName());
sw.stop();
sw.start("洗漱");
Thread.sleep(2000);
System.out.println("當前任務名稱:" sw.currentTaskName());
sw.stop();
sw.start("鎖門");
Thread.sleep(500);
System.out.println("當前任務名稱:" sw.currentTaskName());
sw.stop();
System.out.println(sw.prettyPrint()); // 這個方法打印在我們記錄日誌時是非常友好的 還有百分比的分析哦
System.out.println(sw.shortSummary());
System.out.println(sw.currentTaskName()); // stop後它的值爲null
// 最後一個任務的相關信息
System.out.println(sw.getLastTaskName());
System.out.println(sw.getLastTaskInfo());
// 任務總的耗時 如果你想獲取到每個任務詳情(包括它的任務名、耗時等等)可使用
System.out.println("所有任務總耗時:" sw.getTotalTimeMillis());
System.out.println("任務總數:" sw.getTaskCount());
System.out.println("所有任務詳情:" sw.getTaskInfo()); // 拿到所有的任務
}
當前任務名稱:起牀
當前任務名稱:洗漱
當前任務名稱:鎖門
StopWatch 'd6ba9412-d551-4ba7-8b0e-1b7ccb42855d': running time (millis) = 3504
-----------------------------------------
ms % Task name
-----------------------------------------
01001 029% 起牀
02000 057% 洗漱
00503 014% 鎖門
StopWatch 'd6ba9412-d551-4ba7-8b0e-1b7ccb42855d': running time (millis) = 3504
null
鎖門
org.springframework.util.StopWatch$TaskInfo@2d554825
所有任務總耗時:3504
任務總數:3
所有任務詳情:[Lorg.springframework.util.StopWatch$TaskInfo;@68837a77