简介

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了,赶紧解决,此时查看日志成了最快、最方便的方式,你就可以甩锅了,那谁谁谁服务出问题了。

正确方式

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

  2. On the fly 推荐阿里巴巴开源神器:Arthas
    GitHub:https://github.com/alibaba/arthas
    文档地址:https://arthas.aliyun.com/doc/

Spring-StopWatch的使用相关推荐

  1. filter 中用spring StopWatch 监控请求执行时间

    在filter中用spring stopWatch 来统计每个请求的执行时间: 虽然在firefox 中可以清楚的看到每个请求的执行时间,但是为了测试,记录日志, 方便以后查询维护. 还是必要的,下面 ...

  2. stopwatch_在Java中衡量执行时间– Spring StopWatch示例

    stopwatch 有两种方法可以通过使用System.currentTimeinMillis()或使用System.nanoTime() 来测量Java中经过的执行时间 . 这两个方法可用于测量 J ...

  3. 在Java中衡量执行时间– Spring StopWatch示例

    有两种方法可以通过使用System.currentTimeinMillis()或通过使用System.nanoTime() 来测量Java中经过的执行时间 . 这两个方法可用于测量 Java中两个方法 ...

  4. Spring中的计时器StopWatch

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 需要记录每个任务执行时间,或者记录一段代码执行时间,简单方法是打印当前时间与执行完时间的差值,若执行 ...

  5. 计时器工具 StopWatch

    我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新文章. 文章目录 前言 Spring StopWatch 实践例子 源码分析 lang3 ...

  6. java stopwatch_Spring StopWatch使用实例详解

    这篇文章主要介绍了Spring StopWatch使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 StopWatch简单的秒表,允许多个 ...

  7. 6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  8. java sleep方法_6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  9. Java统计代码的执行时间的6种方法

    方法一:System.currentTimeMillis 此方法为 Java 内置的方法,使用 System.currentTimeMillis 来执行统计的时间(统计单位:毫秒)(统计单位:毫秒), ...

  10. 代码中统计时间(计时)

    方法一:System.currentTimeMillis 此方法为Java内置的方法,使用 System#currentTimeMillis 来统计执行的时间(统计单位:毫秒),示例代码如下: pub ...

最新文章

  1. 当PullToRefreshScrollView里面嵌套ListView
  2. 图解DIV相关编程实例
  3. 互联网到了什么程度?
  4. LINUX ulimit命令
  5. CVPR 2021 | 基于跨任务场景结构知识迁移的单张深度图像超分辨率方法
  6. 第三届“达观杯”文本智能算法大赛参赛指南
  7. 记我面试6家公司的感悟
  8. 蓝桥杯第七届省赛JAVA真题----剪邮票
  9. 老化试验机ami怎么寻找过去的数据_广东元耀:您知道塑料臭氧老化试验机检测浓度的方法有哪些吗?...
  10. linux 网络 PING IP可以通,ping域名ping不通
  11. Facebook开源新NLP框架:简化部署流程,大规模应用也OK
  12. TeeChart的X轴,使用伪装的时间
  13. python名词同义词只替换2个_用同义词替换句子中的每个单词的Python程序
  14. Hadoop安装教程——单机 / 伪分布式配置
  15. 《走出强迫的泥潭——森田疗法指导集锦》
  16. 磁珠特性以及选型注意事项
  17. 如何优雅高效地使用Python——这些Python技巧你必须学会!
  18. 从今开始,两耳不闻窗外事,一心搞dp
  19. 武汉大学计算机学院周维,周维勋
  20. Python的学习(十八)---- 单元测试工具nose

热门文章

  1. Doxygen 使用总结
  2. 了解Windows 10中的新开始菜单
  3. 简单好用的二级区域选择控件
  4. 我的HarmonyOS实战 — 一篇文章讲明白什么是鸿蒙2.0服务卡片
  5. 关于 simulink 的 1/z 模块是什么的问题
  6. 多语言的测试注意事项
  7. panda3d python_安装 Panda3D 并使用原有的Python
  8. 轨道交通通信施工学习总结(三)区间光电缆敷设
  9. 腾讯云网站备案咨询解答:网站能否备案?
  10. C++运算符重载函数