使用 StopWatch 优雅打印执行耗时

https://mp.weixin.qq.com/s/jyEFARr4BYfyc3lG_3kYPg

01、背景

有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进一步控制,则需要在程序中很多地方修改,目前spring-framework提供了一个StopWatch类可以做类似任务执行时间控制,也就是封装了一个对开始时间,结束时间记录工具

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>

02、示例

我们来看几个示例

03、统计输出总耗时

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

04、输出最后一个任务的耗时

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

05、以优雅的格式打出所有任务的耗时以及占比

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

06、序列服务输出耗时信息

@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;
}

07、更多用法

不同的打印结果

1、 getTotalTimeSeconds()获取总耗时秒,同时也有获取毫秒的方法;
2、 prettyPrint()优雅的格式打印结果,表格形式;
3、 shortSummary()返回简短的总耗时描述;
4、 getTaskCount()返回统计时间任务的数量;
5、 getLastTaskInfo().getTaskName()返回最后一个任务TaskInfo对象的名称;

08、总结

以后我们统计代码执行效率建议大家都使用这个工具来进行输出,不需要在starttime、endtime再相减计算,用优雅的方式来完成这件事情。

StopWatch是Spring核心包中的一个工具类,它是一个简单的秒表工具,可以计时指定代码段的运行时间以及汇总这个运行时间,使用它可以隐藏使用

System.currentTimeMillis() ,提高应用程序代码的可读性并减少计算错误的可能性。

注意事项

StopWatch对象不是设计为线程安全的,并且不使用同步。

使用场景

一般是在开发过程中验证性能,而不是作为生产应用程序的一部分

StopWatch类的构造器和一些关键方法

方法说明
new StopWatch() 构建一个新的秒表,不开始任何任务。
new StopWatch(String id) 创建一个指定了id的StopWatch
String getId() 返回此秒表的ID
void start(String taskName) 不传入参数,开始一个无名称的任务的计时。 传入String类型的参数来开始指定任务名的任务计时
void stop() 停止当前任务的计时
boolean isRunning() 是否正在计时某任务
String currentTaskName() 当前正在运行的任务的名称(如果有)
long getTotalTimeMillis() 所有任务的总体执行时间(毫秒单位)
double getTotalTimeSeconds() 所有任务的总时间(以秒为单位)
String getLastTaskName() 上一个任务的名称
long getLastTaskTimeMillis() 上一个任务的耗时(毫秒单位)
int getTaskCount() 定时任务的数量
String shortSummary() 总运行时间的简短描述
String prettyPrint() 优美地打印所有任务的详细耗时情况
posted @ 2022-06-07 11:54  韩憨  阅读(251)  评论(0编辑  收藏  举报
//看板娘