基于IDEA调试模式与StopWatch工具类如何优雅实现Java代码执行时间检测统计

目录

  • 1.1、前言
  • 1.2、开发环境
  • 1.3、传统方式实现
  • 1.4、优雅方式实现
    • 1.4.1、StopWatch工具简介
    • 1.4.2、实现步骤

1.1、前言

        作为程序员在我们的日常编码过程中经常需要统计一段代码或者一个方法的执行时间,尤其是当以一个接口的执行响应时间比较长需要优化的时候,我们就需要统计接口实现方法中的那些代码片段执行比较耗时,然后再针对耗时较长的代码片段进行分析,优化代码的执行效率已达到优化接口的目的。
        通常的做法是在代码片段开始的地方增加一句代码记录开始时间,再在代码结束的大方增加一句代码记录结束时间,结束时间减去开始时间得到代码的执行时间,然后输出即可。这样的做法虽然简单快速,但是其做法有着致命的缺陷,首先是在于对代码有侵入性,并且冗余代码多,我们需要不断的拷贝代码、修改代码、删除代码,尤其是在统计结束后或者需要将代码发布到正式生产环境的时,就需要将这些无效代码删除掉,特别的繁琐。总之就是这种方式不够优雅。本博文将介绍基于IDEA调试模式与StopWatch工具类如何优雅实现Java代码执行时间检测统计。

1.2、开发环境

        本文将采用Java语言,基于JDK8基础环境、Maven、Idea等工具进行开发实现。JDK环境的安装请参考JDK安装部署。具体如下:

环境名称版本号
JDK1.8.0_202
Maven3.6.3
Idea2019.3.5

1.3、传统方式实现

        有时候我们想要知道一段代码的执行时间,传统最简单快速的方式可以这样做,在代码片段开始的地方增加一句代码记录开始时间,再在代码结束的大方增加一句代码记录结束时间,结束时间减去开始时间得到代码的执行时间,然后输出即可。具体代码如下:

public void testOne() throws InterruptedException {CodeExecuteTimeService service = new CodeExecuteTimeServiceImpl();log.info("开始执行统计服务1。");long start1 = System.currentTimeMillis();service.func1();long end1 = System.currentTimeMillis();log.info("统计服务1执行结束。");log.info("代码执行时间统计服务1耗时:{} 毫秒。",end1-start1);log.info("开始执行统计服务2。");long start2 = System.currentTimeMillis();service.func2();long end2 = System.currentTimeMillis();log.info("统计服务2执行结束。");log.info("代码执行时间统计服务2耗时:{} 毫秒。",end2-start2);log.info("开始执行统计服务3。");long start3 = System.currentTimeMillis();service.func3();long end3 = System.currentTimeMillis();log.info("统计服务3执行结束。");log.info("代码执行时间统计服务3耗时:{} 毫秒。",end3-start3);}

        代码执行结果如下:
执行结果1
        从上面结果来看传统做法是没有任务问题的,代码的执行时间也能正确统计出来,但是这样的做法是不够优雅也不利于扩展,当后面要同时服务4、服务5甚至更多服务时间我们就需要重复的拷贝和修改代码,特别的繁琐。因此这样的做法不推荐。

1.4、优雅方式实现

        优雅方式实现主要是基于IDEA调试模式与StopWatch工具类,充分利用了Spring提供的StopWatch工具的优势,实现了Java代码执行时间检测统计。

1.4.1、StopWatch工具简介

        StopWatch 是 Spring 提供的一个工具类,用于测量代码段的执行时间,它可以帮助开发者了解代码的性能,以便进行优化。

  • StopWatch 主要提供以下功能:
    开始和停止测量:通过调用 start() 方法开始测量代码段执行的时间,通过调用 stop() 方法停止测量。
    添加子任务:可以调用 start() 方法为当前任务添加一个子任务,方便对多个代码段进行时间跟踪。
    获取详细时间报告:调用 toString() 方法可以获取当前 StopWatch 的详细时间报告,包括所有子任务的开始时间、结束时间和总执行时间。
    重置:通过调用 reset() 方法可以重置 StopWatch,恢复到初始状态,便于下次使用。
  • StopWatch 工具的主要优点包括:
    易于使用StopWatch 提供了简单的 API 来开始停止时钟,提供了方便的方式进行时间分析,不需要复杂的配置。
    代码清晰:使用 StopWatch 可以清晰地区分多个代码块(时钟),增加了代码的可读性,易于理解那个部分的代码运行得慢。
    简洁的时间输出:通过使用 StopWatch,代码会自动执行,结果可以清晰地显示各个不同代码块完成所需的时间。
    集成Spring框架:由于是Spring提供的工具,与Spring框架的其他模块和注解(如@Async)兼容,易于在Spring应用中集成,无缝支持并发任务和异步编程。
    灵活性:除了记录任务的执行时间外,根据需求还可以在StartStop事件间添加业务逻辑,以满足特定的性能监控需求。

1.4.2、实现步骤

        编写StopWatch工具类,具体代码如下:

package cn.dz.smart.utils;import org.springframework.util.StopWatch;/*** @ClassName StopWatchUtil.java* @Author wzd* @Version 1.0.0* @Description 代码片段执行时间统计工具类* @CreateTime 2024年06月30日 23:34:00*/
public class StopWatchUtil {private final static StopWatch STOP_WATCH = new StopWatch("代码运行时间检测");/*** @Description: 开始某个任务计时* @Params: taskName 任务名称* @Return: 无* @Author: wzd* @Date: 2024年6月30日23:36:39*/public static void start(String taskName) {STOP_WATCH.start(taskName);}/*** @Description: 停止某个任务计时* @Params: 无* @Return: 无* @Author: wzd* @Date: 2024年6月30日23:36:39*/public static void stop() {STOP_WATCH.stop();}/*** @Description: 打印所有任务的执行时间* @Params: 无* @Return: 无* @Author: wzd* @Date: 2024年6月30日23:36:39*/public static String print() {return STOP_WATCH.prettyPrint();}
}

        在需要统计执行时间的代码片段的起始位置和结束位置打上断点,具体如下:
断点
        上面模拟了三耗时代码,在每段代码的起始位置和结束位置都有一条输出语句方便我们打断点,看这里的断点是黄色的,平常的断点是红色的,表示程序在调试模式下代码执行到此处时中断,但是这里是黄色的原因是我们对这个断点进行了修改,其目的是使其的作用从原来的中断程序变成动态插入一段代码,而这段代码则是我们检测代码执行时间所写的工具类。
        修改断点,右键进入这个断点的修改配置页面,具体的修改项如下:
设置项
        对断点有两处修改:

  • 取消勾选Suspend,这个默认是勾选的,表示中断程序,也就是断点最基本的作用,因为我们的需求是打印执行时间,并不需要中断程序,所以这里不勾选。
  • 在Evaluate and log里面填写我们要执行的代码,图上所示我们执行了一段代码:
StopWatchUtil.start("服务1")
  • 最后点击【Done】按钮保存设置即可。
            测试代码如下:
@Testpublic void testTwo() throws InterruptedException {CodeExecuteTimeService service = new CodeExecuteTimeServiceImpl();log.info("开始执行统计服务1。");service.func1();log.info("统计服务1执行结束。");log.info("开始执行统计服务2。");service.func2();log.info("统计服务2执行结束。");log.info("开始执行统计服务3。");service.func3();log.info("统计服务3执行结束。");log.info("所有统计服务执行结束,耗时统计如下:");}

        打完断点并修改完成后,通过调试模式执行代码(因为用了断点,所以要在调试模式下运行程序才能生效),得到的输出结果如下:
结果2
        上述执行结果是STOP_WATCH.prettyPrint()方法所输出的内容,这部分是StopWatch类返回的,点进去可以看到源码,因为时间显示为纳秒,所以我们也可以自行定制成毫秒、秒,这点可以自行查阅StopWatch类的文档来实现。
        现在来看这种实现方式是比较优雅的,该种实现方式对原来的代码没有侵入性,虽然我们写了一个工具类,但是只会在调试模式下、触发断点的地方使用到,当我们打包代码部署上线时,不需要对项目做任何的修改。因此该种方式是比较推荐的。
        其完整的工程代码下载地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PHP技术的校园论坛设计的设计与实现08586

基于PHP技术的校园论坛设计的设计与实现 摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统,以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能,并结合社交化特点,增强…

Vulkan学习——渲染3D模型

摘要:本文简要描述了Vulkan渲染一个3D模型需要做的事情,不会对太细节的内容进行深究。   关键字:Vulkan,Render,3D 源码 1 简介 1.1 Vulkan简介 Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口(API&#x…

创意无界:探索国产创成式填充的无限潜力

在数字艺术与设计的世界中,创新技术不断涌现,而"创成式填充"无疑是其中的一颗璀璨新星。今天米兔要安利的这款国产ps插件-StartaAI拥有强大的AI功能,其AI扩图和局部重绘更是成为PS创成式填充的国产平替。 什么是创成式填充&#x…

PADS设置板框提示不闭合的解决办法

一般是选中join,提示不闭合,不能转成板框,其实直接点击close就好了,报错提示里就有提示,让用close命令试试

基于SpringBoot扶农助农政策管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

html页面可加密吗?

问:html页面可加密吗? 答:可以。 问:怎样加密? 答:看图:

VSCode无法识别 node、npm

一、前提 电脑新安装了node.js,在cmd查看node和npm版本没有问题,但是在VSCode无法识别 1.cmd查看版本: 2.VSCode报错信息: 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果…

面经-计算机基础

1.计算机⽹络 1.1 OSI与TCP/IP各层的结构与功能,都有哪些协议? 计算机网络体系结构 应⽤层 应⽤层 (application-layer )的任务是通过应⽤进程间的交互来完成特定⽹络应⽤。 应⽤层协议定 义的是应⽤进程(进程:主机中正在运⾏的程序&…

redis,memcached,nginx网络组件

课程目标: 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用:io检测 是否就绪 io操作 1. int clientfd accept(listenfd, &addr, &l…

Eclipse配置Tomcat时无Apache选项问题

有可能你会遇到,安装最新版本Eclipse,但是 Window——Preferences——Servers——Runtime Environments。发现没有Apache选项。,这是因为,默认没有安装J2EE组件,我们可以通过手动安装,来解决这个问题。 一…

硬件实用技巧:cadence Aleego创建焊盘过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140110911 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

<电力行业> - 《第11课:配电(1)》

1 配电 配电(power distribution)是在电力系统中直接与用户相连并向用户分配电能的环节。配电系统由配电变电所、高压配电线路、配电变压器、低压配电线路以及相应的控制保护设备组成。 1.1 概念 配电系统是由多种配电设备(或元件&#xf…

vue2中vuedraggable设置部分元素不可拖拽,不可移动

文章目录 前言1、版本2、vuedraggable页面的具体使用3.核心(1) move官网说明(2) 注意点:(3) onDraggableMove方法 总结 前言 需求:左边是复选框,右边是选中的数据,编辑传入的数据不可拖拽,不可移动(其实还…

Datax快速使用之牛刀小试

前言 一次我发现业务他们在用 datax数据同步工具,我尤记得曾经 19 年使用过,并且基于当时的版本还修复了个 BUG并且做了数据同步管道的集成开发。没想到时间过的飞快,业务方基于海豚调度 2.0.6 的版本中有在使用,由于业务方还没有…

【启明智显活动分享】 启明与你,上海慕尼黑电子展不见不散!

启明与你,上海慕尼黑电子展不见不散!🎉 🔍 展会现场,你将亲眼目睹RTOS、LINUX、Android全系列方案及产品的精彩展示。从经典到前沿,一站式满足你的技术探索需求。 💡 更值得期待的是&#xff0…

Java源码实现《植物大战僵尸》

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 植物大战僵尸源码,看图: 视频演示 java植物大战僵尸 环境JDK1.8 类继承UML图 源码实现 我们先从main函数看起,继承了javafx.application.Application。JavaFx是Java图形…

mysql5.7.30忘记root密码

windows系统安装了mysql5.7.30,在使用navicat链接mysql时候,提示 如何解决: 打开任务管理器的服务,查看有没有MYSQL服务。 如果没有,则按照下面的csdn博客进行操作。 https://blog.csdn.net/clj198606061111/article…

Eclipse 2024最新版本分享

一、软件介绍 Eclipse是一个开源的、基于Java的可扩展开发平台,最初由IBM公司开发,后于2001年贡献给开源社区,并由Eclipse基金会负责管理和开发。 如果在官网上下载比较慢,可以试试从云盘中下载,解压即可使用。 二、下…

使用Pogo-DroneCAN CANHUB扩展板扩展飞控的CAN口

关键词:Ardupilot,Pixhawk,DroneCAN CANHUB扩展,扩展飞控CAN口 keywords:Ardupilot,Pixhawk,DroneCAN CANHUB Extend 摘要:使用Pogo-DroneCAN CANHUB扩展板扩展飞控CAN口&#xff…

一文讲解Docker入门到精通

一、引入 1、什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,它允许在一台物理机上创建多个独立的虚拟环境,这些环境被称为虚拟机(VM)。每个虚拟机都可以…