Spring-StopWatch的使用

简介
StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时。不是为线程安全而设计的,并且不使用同步。

使用
当我们想对程序中一连串的某些耗时操作进行耗时统计,定位具体哪些操作耗时最多,进而分析、调优时,需要对串行各个操作(如方法调用)进行计时,从而定位最耗时的步骤或超过调用时间阈值的操作。

祖传方式
 long start = System.currentTimeMillis();
 businessMethod();
 long end = System.currentTimeMillis();
 LOGGER.info("businessMethod,耗时:{}", end - start);

打印的日志示例

16:23:14.482 [main] INFO cn.pengld.TestLogError - businessMethod,耗时:3002

StopWatch方式
 StopWatch stopWatch = new StopWatch("查询XXXX");

 stopWatch.start("业务方法1");
 businessMethod();
 stopWatch.stop();

 stopWatch.start("业务方法2");
 businessMethod();
 stopWatch.stop();

 stopWatch.start("业务方法3");
 businessMethod();
 stopWatch.stop();

 System.out.println(stopWatch.getTotalTimeMillis());
 System.out.println(stopWatch.prettyPrint());

打印的日志示例

5018
StopWatch '查询XXXX': running time = 5018845700 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
002147300  000%  业务方法1
3003068700  060%  业务方法2
2013629700  040%  业务方法3

代码参考:https://gitee.com/code-promotion/my-code-test/blob/dev/src/main/java/cn/pengld/StopWatchTest.java

源码解析
可以看到在start方法中用了类成员变量记录了 startTimeNanos 为系统当前时间的纳秒数
在stop方法中计算 lastTime 使用的是当前纳秒减去 startTimeNanos ,得到的 lastTime 即为介于 start 与 stop 方法中间的代码块的耗时。

这里笔者使用的是SpringBoot应用程序,版本为 2.3.12.RELEASE ,在较低版本中使用的是毫秒数System.currentTimeMillis()


在 stop 方法中将此次 task 的执行耗时信息(currentTaskName,lastTime)使用内部类 TaskInfo 的实例保存起来,并添加到 StopWatch 的成员变量 taskList 中。


需要注意的是


让我们回到类的注释,解读一下这句话:

Note that this object is not designed to be thread-safe and does not use synchronization.
This class is normally used to verify performance during proof-of-concept work and in development, rather than as part of production applications.

大意是 StopWatch 不是线程安全的,不推荐作为生产环境中程序的一部分

但多数情况下,在大部分中小型公司没人在乎,尤其是在微服务架构下,跨服用调用,普通开发无法直接接触线上环境,只能通过 SLS、ELFK 分析、定位。设想当你不知道你依赖的服务因某种原因突然 CPU 打满,导致你的服务调用时间变长,甚至超时。在用户(老板或测试)看来,你的程序出Bug了,赶紧解决,此时查看日志成了最快、最方便的方式,你就可以甩锅了,那谁谁谁服务出问题了。

正确方式
怎么打日志可参考一下 https://icyfenix.cn/distribution/observability/logging.html
深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第三版)作者出版的凤凰架构

On the fly 推荐阿里巴巴开源神器:Arthas
GitHub:https://github.com/alibaba/arthas
文档地址:https://arthas.aliyun.com/doc/
————————————————
版权声明:本文为CSDN博主「MadLifeBin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MadLifeBin/article/details/120550966

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值