还在用 System.currentTimeMillis() 统计代码耗时?太 Low 啦

本文介绍了如何在SpringFramework中使用StopWatch类来记录和分析任务执行时间,包括统计总耗时、输出最后一个任务耗时、以优雅格式显示耗时占比,以及在序列服务中的应用示例。
摘要由CSDN通过智能技术生成

1. 背景

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

2. 统计总耗时

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

3. 输出最后一个任务的耗时

    public static void main(String[] args) throws InterruptedException {
        StopWatch stopWatch = new StopWatch();

        // 开始计时
        stopWatch.start();

        // 模拟第一次任务执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 停止第一个任务
        stopWatch.stop();

        // 输出最后一次任务执行的时间
        System.out.println("First Task Time: " + stopWatch.getLastTaskTimeMillis() + " ms");

        // 开始另一个任务
        stopWatch.start();

        // 模拟第二次任务执行
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 停止第二个任务
        stopWatch.stop();

        // 输出最后一次任务执行的时间
        System.out.println("Second Task Time: " + stopWatch.getLastTaskTimeMillis() + " ms");

        // 输出所有任务的总时间
        System.out.println("Total Time: " + stopWatch.getTotalTimeMillis() + " ms");
            }
        }

输出

Second Task Time: 513 ms
Total Time: 1527 ms

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

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

5. 序列服务输出耗时信息

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

6. 更多用法

  • getTotalTimeSeconds() 获取总耗时秒,同时也有获取毫秒的方法
  • prettyPrint() 优雅的格式打印结果,表格形式
  • shortSummary() 返回简短的总耗时描述
  • getTaskCount() 返回统计时间任务的数量
  • getLastTaskInfo().getTaskName() 返回最后一个任务TaskInfo对象的名称
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值