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

简介: 还在用 System.currentTimeMillis() 统计代码耗时?太 Low 啦
  • 01、背景
  • 02、示例
  • 03、统计输出总耗时
  • 04、输出最后一个任务的耗时
  • 05、以优雅的格式打出所有任务的耗时以及占比
  • 06、序列服务输出耗时信息
  • 07、更多用法
  • 08、总结

01、背景

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

02、示例

我们来看几个示例

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

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再相减计算,用优雅的方式来完成这件事情。

目录
打赏
0
0
0
0
579
分享
相关文章
|
9月前
|
System.currentTimeMillis()方法总结
System.currentTimeMillis()方法总结
System Generator学习——时间和资源分析
System Generator学习——时间和资源分析
82 3
灵魂拷问:你真的理解System.out.println()打印原理吗?
灵魂拷问:你真的理解System.out.println()打印原理吗?
145 0
|
10月前
毫秒计数转化为std::tm以及SYSTEM
毫秒计数转化为std::tm以及SYSTEM
108 0
用StopWatch 统计代码耗时
用StopWatch 统计代码耗时
138 0
用StopWatch 统计代码耗时
一日一技:为什么不建议使用 time.sleep 实现定时功能?
一日一技:为什么不建议使用 time.sleep 实现定时功能?
202 0
别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!
别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!
246 0
别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!
System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
240 0
注意了!System.currentTimeMillis() 存在性能问题...
System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码执行时长等,在我们的印象中应该快如闪电。 但实际上在并发调用或者特别频繁调用它的情况下(比如一个业务繁忙的接口,或者吞吐量大的需要取得时间戳的流式程序),其性能表现会令人大跌眼镜。
注意了!System.currentTimeMillis() 存在性能问题...
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等