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

2022-07-04 13:17:28 浏览数 (1)

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~
  • 中文详细注释的开源项目
  • RPC 框架 Dubbo 源码解析
  • 网络应用框架 Netty 源码解析
  • 消息中间件 RocketMQ 源码解析
  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
  • 作业调度中间件 Elastic-Job 源码解析
  • 分布式事务中间件 TCC-Transaction 源码解析
  • Eureka 和 Hystrix 源码解析
  • Java 并发源码

来源:ningyu1.github.io/20190505/

116-stop-watch.html

  • 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、统计输出总耗时

代码语言:javascript复制
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());
    }
}

输出

代码语言:javascript复制
1013

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

代码语言:javascript复制
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());
    }
}

输出

代码语言:javascript复制
1009

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

代码语言:javascript复制
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());
    }
}

输出

代码语言:javascript复制
StopWatch '': running time (millis) = 1031
-----------------------------------------
ms     %     Task name
-----------------------------------------
00514  050%  A
00302  029%  B
00215  021%  C

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

代码语言:javascript复制
@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再相减计算,用优雅的方式来完成这件事情。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

代码语言:javascript复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)

0 人点赞