如何優雅的打印代碼執行時長

如何優雅的打印代碼執行時長

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章