相信很多人都遇到这样一个问题?

加班加点,上线了一个功能,但接口的响应时间有点长?

如何定位排查?

普通研发人员一般会采用下面方式,在很多位置点埋入开始时间戳、结束时间戳,相减便得到耗时。代码如下:

long start1 = System.currentTimeMillis();
// 模拟业务逻辑处理
Thread.sleep(300);
long end1 = System.currentTimeMillis();long start2 = System.currentTimeMillis();
// 模拟业务逻辑处理
Thread.sleep(730);
long end2 = System.currentTimeMillis();System.out.println("执行操作1,耗时:" + (end1 - start1));
System.out.println("执行操作2,耗时:" + (end2 - start2));

虽然书写简单,但导致系统中充斥着大量低级代码,比较烦人,很容易让人怀疑你的技术实力。

我们的直接想法是能不能写个工具类,即统计代码块耗时,还能将分析结果直观展示出来

恰好 Spring框架提供了一个工具类,org.springframework.util.StopWatch,提供了轻量级统计功能,对应的pom文件依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.9.RELEASE</version>
</dependency>

StopWatch 源码

省略。。。
public void start(String taskName) throws IllegalStateException {if (this.currentTaskName != null) {throw new IllegalStateException("Can't start StopWatch: it's already running");} else {this.currentTaskName = taskName;this.startTimeNanos = System.nanoTime();}
}public void stop() throws IllegalStateException {if (this.currentTaskName == null) {throw new IllegalStateException("Can't stop StopWatch: it's not running");} else {long lastTime = System.nanoTime() - this.startTimeNanos;this.totalTimeNanos += lastTime;this.lastTaskInfo = new StopWatch.TaskInfo(this.currentTaskName, lastTime);if (this.keepTaskList) {this.taskList.add(this.lastTaskInfo);}++this.taskCount;this.currentTaskName = null;}
}省略。。。

start与stop方法分别记录开始时间与结束时间。

其中在记录结束时间时,会维护一个链表类型的tasklist属性,从而使该类可记录多个任务,最后的输出也仅仅是对之前记录的信息做了一个统一的归纳输出,从而使结果更加直观的展示出来。

prettyPrint方法,可直观的输出代码执行耗时,以及执行时间百分比。

StopWatch 优点

  • Spring框架自带,操作简单,开箱即用

  • 任务start时可以指定name,显示更加友好

  • 数据归纳,展示每项任务耗时与占用总时间的百分比,展示结果直观

缺点:

  • 一个StopWatch不能同时启动多个任务,必须在当前任务stop之后才能开启新的task。若要一次开启多个,需要new一个新的StopWatch实例

  • 代码有侵入性

代码示例:

StopWatch sw = new StopWatch();
sw.start("任务1");
// 模拟业务逻辑处理
Thread.sleep(300);
sw.stop();sw.start("任务2");
// 模拟业务逻辑处理
Thread.sleep(730);
sw.stop();System.out.println(sw.prettyPrint());

运行结果:

StopWatch '': running time (millis) = 1033
-----------------------------------------
ms     %     Task name
-----------------------------------------
00303  029%  任务1
00730  071%  任务2

类似工具

除了上面 Spring 提供了工具外,apache下的org.apache.commons.lang.time.StopWatch 和 Guava 下的com.google.common.base.Stopwatch 都提供了类似的工具

大家根据自己的喜好,选择使用。原理大同小异,只是编码风格略有不同。

项目源码地址

https://github.com/aalansehaiyang/spring-boot-bulking  模块:spring-boot-bulking-tool

最后,阿里巴巴还开源一种系统诊断工具(Arthas),支持在线分析系统瓶颈,并提供了丰富的命令行操作,感兴趣的同学可以体验。

往期推荐

  • 还在用Mybatis? Spring Data JPA 让你的开发效率提升数倍!

  • Redis 实现分布式锁真的安全吗?

  • 开箱即用,一键集成 Redis 缓存

  • 淘宝订单自动确认收货的N种实现,秒杀面试官

  • 深入剖析优惠券核心架构设计

  • 某生鲜电商平台的库存扣减方案

  • Spring Boot 集成 Elasticsearch 实战

  • 如何设计一个高性能的秒杀系统

  • 如何通过Binlog来实现不同系统间数据同步

  • 如何打造一个高效的研发团队

  • 聊聊电商促销业务

  • DDD是如何解决复杂业务扩展问题?

我们热衷于收集高并发、系统架构、微服务、消息中间件、 RPC框架、高性能缓存、搜索、分布式数据框架、分布式协同服务、分布式配置中心、中台架构、领域驱动设计、系统监控、系统稳定性等技术知识。

欢迎你扫 ↑↑↑ 二维码加入我们。在群里,深入交流、共同成长、共同进步!  书山有路勤为径, 学海无涯苦作舟。

关注公众号,后台回复 “中台”,下载PDF学习资料

分享一个统计代码块耗时的小工具相关推荐

  1. jsp中java代码无效_来杯咖啡,教你如何优雅的在java中统计代码块耗时

    推荐阅读: Sping源码+Redis+Nginx+MySQL等七篇实战技术文档,阿里大佬推荐 阿里内部:2020年全技术栈文档+PPT分享,(万粉总结,回馈粉丝) 在我们的实际开发中,多多少少会遇到 ...

  2. 如何优雅的在java中统计代码块耗时

    在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下 long start = System.currentTimeMillis(); try {// .... 具体的代 ...

  3. 分享一个python采集中国福利彩票的小代码

    分享一个python采集中国福利彩票的小代码 分享一个python采集中国福利彩票的小代码 能采集双色球,七乐彩,3D彩票任意一段时间的开奖号码,根据需求取消请求头注释,就能采集数据.(初学者请勿评价 ...

  4. C++统计代码执行耗时

    C++统计代码执行耗时 文章目录 C++统计代码执行耗时 1. 需求 2. 代码结构 3. CMakeLists文件 4. 核心代码 5. 使用测试 1. 需求 统计项目中代码执行耗时 2. 代码结构 ...

  5. R语言统计代码运行耗时实战:计算代码运行时间、使用proc.time函数计算代码运行时间

    R语言统计代码运行耗时实战:计算代码运行时间.使用proc.time函数计算代码运行时间 目录

  6. 代码太多不要怕,分享一个阅读代码的神器

    大家好,我是程序员小哈. 又到了知识分享时间,今天我给大家分享一个阅读代码的神器,如果对你有所帮助的话,还请文末点赞支持一下哈. 今天给大家介绍一个查看代码的编辑器软件:Source Insight, ...

  7. python编写数据库连接工具_详解使用Python写一个向数据库填充数据的小工具(推荐)...

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  8. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  9. 做了一个阿里云MQTT单片机编程小工具

      做了一个阿里云MQTT单片机编程小工具,点击测试http://www.norra.cn:9091/   传感云是采集.传输.存储.可视化.接口.APP.微信一体的传感器与应用服务平台,支持多种模式 ...

最新文章

  1. st 串口烧写工具 芯片_STM32芯片的几种烧写方式简介
  2. cannot resolve symbol r_64位ret2_dl_runtime_resolve模版题以及踩坑记录
  3. Python异步爬取知乎热榜
  4. 机器学习嵌入式实现_机器学习中的嵌入
  5. Linux触发连锁反应,惠及全球
  6. 转:android 避免内存泄露
  7. 设计模式行为模式_使用行为模式建立很棒的社区
  8. lt;九度 OJgt;题目1545:奇怪的连通图
  9. 2349 Arctic Network prim最小生成树 基础
  10. eclipse 学生管理系统实现(dom4j实现)
  11. 新书推荐 | Java核心技术卷Ⅰ:基础知识(原书第11版)
  12. ADAS/AD控制器模块开发03 - 系统架构设计及通用需求定义
  13. [bugbank]看Fuzz与漏洞擦出火花
  14. 软件文档的作用和分类
  15. java计算机毕业设计民航售票管理系统源代码+数据库+系统+lw文档
  16. 如何用营销思维做好产品运营规划?
  17. 伯恩半导体 - ESD 选型指南
  18. 聆听第18期贡献者荣誉榜发布,体验落地才是王道
  19. MATLAB程序:IEEE802.16d路径损耗模型
  20. Atom使用教程:Atom下载,Atom汉化教程,Atom常用插件

热门文章

  1. 入门到成为UG编程高手,这些步骤你不得不了解
  2. JavaCV音视频开发宝典:rtp点到点音视频传输TS流(一对一音视频直播)
  3. 怎么做3D可视化?NebulaGraph Explorer 的图数据库可视化实践告诉你答案
  4. chrome截图工具
  5. EF的水印和验证码图制做
  6. 【框架】984- 2021 年最佳 JavaScript 框架
  7. 精通Git(四)——Git服务器
  8. MongoDB-分片片键
  9. 《Vue》初识、摘要及入门
  10. Android apk破解反编译应用-EasyDump