Spring框架中如何优雅统计程序的执行时间

本文介绍了如何在SpringBoot项目中利用StopWatch类有效地统计多个接口调用的时间,并计算每个接口的执行时间和占比,提升性能监控效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在工作中经常有统计某个方法的执行时间,比如项目中我们写了一个AOP,在AOP中定义了环绕通知用于向日志中打印相应的参数及方法执行的时间。最常用的方式就是记录一个开始时间,然后在记录结束时间,使用开始时间减去结束时间就可以得出方法执行的时间。如下:

 public Object around(ProceedingJoinPoint pjd) throws Throwable {
        log.info("环绕通知开始");
        // 获取方法名
        String className = pjd.getSignature().getClass().getName();
        // 获取执行的方法名称
        String methodName = pjd.getSignature().getName();
        log.info("方法名称::{}", methodName);
        // 定义返回参数
        Object result = null;
        // 记录开始时间
        long start = System.currentTimeMillis();
        // 获取方法参数
        Object[] args = pjd.getArgs();
        String params = "前端请求参数为:";
        //获取请求参数集合并进行遍历拼接
        for (Object object : args) {
            params += object.toString() + ",";
        }
        params = params.substring(0, params.length() - 1);
        //打印请求参数参数
        log.info("{}类的{}的{}", className, methodName, params);
        // 执行目标方法
        result = pjd.proceed();
        // 打印返回报文
        log.info("方法返回为:{}", result);
        // 获取执行完的时间
        log.info("{}方法执行时长为:{}", methodName, (System.currentTimeMillis() - start));
        log.info("环绕通知结束");
        return result;

    }

这种方式在统计单个任务的时候没有问题。假如我们有这样一个需求,在一个方法中我们调用了多个接口,需要统计每个接口消耗的时间及占比。如果还是使用上面的方法就比较麻烦,在阅读spirngboot源码的时候发现StopWatch可以很好的满足该需求,源码如下:

StopWatch 使用demo如下:

public class Test {
    public static void main(String[] args) throws InterruptedException {
        // 最原始的方法
        long start = System.currentTimeMillis();
        Thread.sleep(3000L);
        long end = System.currentTimeMillis();
        System.out.println("任务耗时:" + (end - start) + "毫秒");
        //使用 StopWatch
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("任务1");
        Thread.sleep(3000L);
        stopWatch.stop();
        stopWatch.start("任务2");
        Thread.sleep(2000L);
        stopWatch.stop();
        System.out.println("最后一个任务耗时:" + stopWatch.getLastTaskTimeMillis() + "毫秒");
        System.out.println("最后一个任务名称:" + stopWatch.getLastTaskName());
        System.out.println("所有任务耗时:" + stopWatch.getTotalTimeMillis() + "毫秒");
        System.out.println("所有任务耗时:" + stopWatch.getTotalTimeSeconds() + "秒");
        System.out.println(stopWatch.shortSummary());
        //打印每个任务执行时间,以及占总时间百分比
        System.out.println(stopWatch.prettyPrint());
        System.out.println(stopWatch.toString());

    }
}

 

执行结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值