结合IDEA断点与StopWatch工具类实现优雅的代码执行时间检测

有时候我们想要知道一段代码的执行时间,最简单快速的方式可以这样做:

java 复制代码
final long start = System.currentTimeMillis();

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

final long end = System.currentTimeMillis();
long time = end - start;

// 输出:执行时间为:1000ms
System.out.println("执行时间为:" + time + "ms");

这种方式虽然简单易用,但是问题在于对代码有侵入性,并且冗余代码多,我们需要不断的拷贝代码、修改代码、删除代码,在开发环境和生产环境之间也不容易切换,简单来说就是这种方式不够优雅

实现方式

要优雅的去实现这个代码执行时间检测,我们选择使用的方式是:

  • IDEA的断点调试模块 + 自定义代码工具类(基于StopWatch)

如何实现和使用

示例代码

如下面的示例代码:

我们模拟了两段耗时代码,在每段代码的起始点都有一条输出语句方便我们打断点,仔细看这里的断点是黄色 的,平常的断点是红色的,表示程序在调试模式下代码执行到此处时中断 ,但是这里是黄色的原因是我们对这个断点进行了修改,使其的作用从原来的中断程序变成动态插入一段代码,而这段代码则是我们检测代码执行时间所写的工具类。

修改断点

我们右键进入这个断点:

我们对断点有两处修改:

  • 一是取消勾选Suspend,这个默认是勾选的,表示中断程序,也就是断点最基本的作用,因为我们的需求是打印执行时间,并不需要中断程序,所以这里不勾选

  • 二是在Evaluate and log里面填写我们要执行的代码,图上所示我们执行了一段代码:

    java 复制代码
    StopWatchExpand.start("A")

    这是我们写的工具类,为了方便使用我们写成静态方法。

编写工具类

java 复制代码
import org.springframework.util.StopWatch;

public class StopWatchExpand {
    private final static StopWatch STOP_WATCH = new StopWatch("代码运行时间检测");

    // 开始计时
    public static void start(String taskName) {
        STOP_WATCH.start(taskName);
    }

    // 停止计时
    public static void stop() {
        STOP_WATCH.stop();
    }

    // 打印所有任务的执行时间
    public static String print() {
        return STOP_WATCH.prettyPrint();
    }
}

StopWatch是Spring的一款计时工具,结合该工具我们可以很方便的实现功能,现在我们回去上面的示例代码里,修改断点内容:

java 复制代码
public static void main(String[] args) {
	// 断点方法:StopWatchExpand.start("A")
    System.out.println("代码执行到A");
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 断点方法:StopWatchExpand.stop()
    System.out.println("A执行完成");

    // 断点方法:StopWatchExpand.start("B")
    System.out.println("代码执行到B");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 断点方法:StopWatchExpand.stop()
    System.out.println("B执行完成");

    // 断点方法:StopWatchExpand.print()
    System.out.println("结束");
}

打完断点并修改好后,通过调试模式执行代码(因为用了断点,所以要在调试模式下运行程序才能生效),得到的输出结果为:

arduino 复制代码
void
代码执行到A
void
A执行完成
void
代码执行到B
void
B执行完成
StopWatch '代码运行时间检测': running time = 1511411000 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
506849100  034%  A
1004561900  066%  B

结束

void表示该方法无返回值,所以执行完后输出一个:void,所以如果返回的是String那么就能输出String内容。

最后是STOP_WATCH.prettyPrint()方法所输出的内容,这部分是StopWatch类返回的,点进去可以看到源码,因为时间显示为纳秒,所以我们也可以自行定制成毫秒、秒,这点可以自行查阅StopWatch类的文档来实现。

结论

现在控制台输出了A和B两段代码的执行时间,我们现在回头看看,是不是没有对原来的代码有侵入性,虽然我们写了一个工具类,但是只会在调试模式下、触发断点的地方使用到,当我们打包代码部署上线时,不需要对项目做任何的修改。

相关推荐
源码宝2 分钟前
企业项目级医院随访系统源码,患者随访管理系统,技术框架:Java+Spring boot,Vue,Ant-Design+MySQL5
java·vue.js·spring·程序·医院管理系统·随访·随访系统源码
canonical_entropy5 分钟前
最小信息表达:从误解到深层理解的五个关键点
后端·架构
手握风云-11 分钟前
JavaEE 进阶第五期:Maven 之道,项目的依赖艺术与构建哲学
java·java-ee·maven
郝开23 分钟前
Spring Boot 2.7.18(最终 2.x 系列版本):版本概览;兼容性与支持;升级建议;脚手架工程搭建
java·spring boot·后端
天若有情6731 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
2301_796512521 小时前
Rust编程学习 - 如何利用代数类型系统做错误处理的另外一大好处是可组合性(composability)
java·学习·rust
清水2 小时前
Spring Boot企业级开发入门
java·spring boot·后端
一个不称职的程序猿2 小时前
高并发场景下的缓存利器
java·缓存
星释2 小时前
Rust 练习册 :Proverb与字符串处理
开发语言·后端·rust
2301_801252222 小时前
Tomcat的基本使用作用
java·tomcat