使用 StopWatch 優雅列印執行耗時

語言: CN / TW / HK

0x01:背景

有時在做開發的時候需要記錄每個任務執行時間,或者記錄一段程式碼執行時間,最簡單的方法就是列印當前時間與執行完時間的差值,然後這樣如果執行大量測試的話就很麻煩,並且不直觀,如果想對執行的時間做進一步控制,則需要在程式中很多地方修改,目前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());    
    }    
} 

輸出

  1. 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());    
    }    
} 

輸出

  1. 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;    
} 

0x02:更多用法

不同的列印結果

  •  getTotalTimeSeconds() 獲取總耗時秒,同時也有獲取毫秒的方法
  •  prettyPrint() 優雅的格式列印結果,表格形式
  •  shortSummary() 返回簡短的總耗時描述
  •  getTaskCount() 返回統計時間任務的數量
  •  getLastTaskInfo().getTaskName() 返回最後一個任務TaskInfo物件的名稱

更多檢視文件

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

0x03:總結

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

鴻蒙官方戰略合作共建——HarmonyOS技術社群

【責任編輯:龐桂玉 TEL:(010)68476606】