使用 StopWatch 優雅列印執行耗時

語言: CN / TW / HK

圖片

背景

有時在做開發的時候需要記錄每個任務執行時間,或者記錄一段程式碼執行時間,最簡單的方法就是列印當前時間與執行完時間的差值,然後這樣如果執行大量測試的話就很麻煩,並且不直觀,如果想對執行的時間做進一步控制,則需要在程式中很多地方修改,目前spring-framework提供了一個StopWatch類可以做類似任務執行時間控制,也就是封裝了一個對開始時間,結束時間記錄工具

示例

  • 統計輸出總耗時

``` import org.springframework.util.StopWatch;      public class SpringStopWatchExample {          public static void main (String[] args) throws InterruptedException {           StopWatch sw = new StopWatch();           sw.start();           //long task simulation           Thread.sleep(1000);           sw.stop();           System.out.println(sw.getTotalTimeMillis());       }   }

```

*輸出*

``` 1013

```

  • 輸出最後一個任務的耗時

``` public class SpringStopWatchExample2 {          public static void main (String[] args) throws InterruptedException {           StopWatch sw = new StopWatch();           sw.start("A");//setting a task name           //long task simulation           Thread.sleep(1000);           sw.stop();           System.out.println(sw.getLastTaskTimeMillis());       }   }

```

輸出

``` 1009

```

  • 以優雅的格式打出所有任務的耗時以及佔比

``` import org.springframework.util.StopWatch;      public class SpringStopWatchExample3 {          public static void main (String[] args) throws InterruptedException {           StopWatch sw = new StopWatch();           sw.start("A");           Thread.sleep(500);           sw.stop();           sw.start("B");           Thread.sleep(300);           sw.stop();           sw.start("C");           Thread.sleep(200);           sw.stop();           System.out.println(sw.prettyPrint());       }   }

```

輸出

``` StopWatch '': running time (millis) = 1031   -----------------------------------------   ms     %     Task name   -----------------------------------------   00514  050%  A   00302  029%  B   00215  021%  C:

```

  • 序列服務輸出耗時資訊

``` @Override   public long nextSeq(String name) {       StopWatch watch = new StopWatch();       watch.start("單序列獲取總消耗");       long sequence = generator.generateId(name);       watch.stop();       logger.info(watch.prettyPrint());       return sequence;   }

```

更多用法

不同的列印結果

  • getTotalTimeSeconds() 獲取總耗時秒,同時也有獲取毫秒的方法

  • prettyPrint() 優雅的格式列印結果,表格形式

  • shortSummary() 返回簡短的總耗時描述

  • getTaskCount() 返回統計時間任務的數量

  • getLastTaskInfo().getTaskName() 返回最後一個任務TaskInfo物件的名稱

參考

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StopWatch.html

總結

以後統計程式碼執行效率建議大家都使用這個工具來進行輸出,不需要在starttime、endtime再相減計算,用優雅的方式來完成這件事情。

往期推薦

[

SpringBoot + Netty4 實現自己RPC

](http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MTUzMg==&mid=2247489767&idx=3&sn=3d55ae73f654aea76a93d6e25c8e42fa&chksm=ebb6fb84dcc17292339c571d561a8847ac14f9fc0fe3d7a53819b3840cda8f0fc987d5997227&scene=21#wechat_redirect)

[

10000份資料整理 送給你!!

](http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MTUzMg==&mid=2247489593&idx=1&sn=ec695c9b2d790e6ea7376655b62025d4&chksm=ebb6fb5adcc1724c00d96d864306ba49d2b22c8823ba9dc2b96f6526034886e041e28bb424ed&scene=21#wechat_redirect)

[

Gradle使用教程

](http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MTUzMg==&mid=2247489279&idx=1&sn=227548e772a23c8309e9a79a5ebbb35e&chksm=ebb6f59cdcc17c8a4aa9f7e64036bba4e7880e9e32266c1c5a96797ad6b813d8cd5dc5a36796&scene=21#wechat_redirect)

[

Spring Boot + Redis  模擬 10w 人的秒殺搶購

](http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MTUzMg==&mid=2247489279&idx=4&sn=924b3a4df681e2c2d18474d6a4142f3b&chksm=ebb6f59cdcc17c8ae113a1ebb5a8dc4850f2324b32e54b80754ce991ef2be33e8a8ab981ab12&scene=21#wechat_redirect)

Vue類似hooks的新庫VueUse

本文使用 文章同步助手 同步