我的StopWatch

 

项目中一个功能很耗时,头儿让我看看是什么原因造成的,看能不能有什么调优。 

 

分析原因时得用数据支持吧, 也就是说看都有哪些因素造成了耗时,各贡献值具体是多少。顺着这个思路想起来和apache中common框架中的一个工具类org.apache.commons.lang.time StopWatch。 

 

它很好的模拟了秒表,通过它的split方法和getSplitTime方法,可以很好地看出各分步骤对性能下降的贡献值来。 

 

演示代码如下:

 

org.apache.commons.lang.time.StopWatch stWatch = new org.apache.commons.lang.time.StopWatch();

 

stWatch.start();

 

step1();

 

stWatch.split();

 

System.out.println("Time consumed by step1: "+stWatch.getSplitTime());

 

step2();

 

stWatch.split();

 

System.out.println("Time consumed by step1 and step2: "+stWatch.getSplitTime());

 

stWatch.stop();

 

 

显示结果: 

Time consumed by step1: 31

Time consumed by step1 and step2: 2031

 

还行,这毕竟比手动地写System.currentTimeMillis() – startTime来实现面向对象些。 

 

但有些不足,从结果可以看出,每次getSplitTime得到的值都是当前所有步骤的总和,而不是当前这个步骤的耗时值,以上面代码为例,它没有直接地得出step1和step2两个步骤的各自耗。有些遗憾啊。 

 

改!

 

于是原来基础上加了两个方法(加了方法的源码见附件): splitAndSaveTime和getSplitTimeByStep。这样的演示代码如下:

 

   

    MyStopWatch stWatch = new MyStopWatch();

 

    stWatch.start();

 

    step1();

 

    stWatch.splitAndSaveTime();

 

    System.out.println("Time consumed by step1: "+stWatch.getSplitTimeByStep());

 

    step2();

 

    stWatch.splitAndSaveTime();

 

    System.out.println("Time consumed by   step2: "+stWatch.getSplitTimeByStep());

 

   stWatch.stop();

 

 

输出结果顺眼多了:

Time consumed by step1: 63

Time consumed by step2: 2000

 

 

记在这里备查,分享,交流。

 

StopWatch 是 Spring 框架中提供的一个轻量级工具类,专门用于测量代码执行时间,适用于代码性能测试和性能分析。它能够简洁、有效地记录代码执行的耗时,并支持多个任务的计时与统计[^1]。 ### 创建与启动 StopWatch 实例 StopWatch 的使用从创建实例开始。通过无参构造函数即可初始化一个 StopWatch 对象。调用 `start()` 方法开始计时,默认情况下会记录第一个任务的开始时间。若希望为任务命名,可以传入任务名称作为参数。 ```java StopWatch stopWatch = new StopWatch(); stopWatch.start("Task1"); ``` ### 暂停与继续计时 StopWatch 支持暂停当前任务的计时,通过 `stop()` 方法结束当前任务的计时,并自动开始记录下一个任务的时间。如果需要暂停后继续计时,需再次调用 `start()` 方法,并传入新的任务名称或使用默认任务名称[^1]。 ```java stopWatch.stop(); // 结束 Task1 的计时 stopWatch.start("Task2"); // 开始 Task2 的计时 ``` ### 获取计时结果 StopWatch 提供了多种方法用于获取计时结果,包括单个任务的执行时间与总时间。例如,`getLastTaskTimeMillis()` 返回最近一次任务的耗时(以毫秒为单位),而 `getTotalTimeMillis()` 则返回所有任务的总耗时。 ```java System.out.println("Last task time (ms): " + stopWatch.getLastTaskTimeMillis()); System.out.println("Total time (ms): " + stopWatch.getTotalTimeMillis()); ``` ### 示例代码 以下是一个完整的 StopWatch 使用示例,展示了如何测量两个任务的执行时间,并输出相关信息: ```java import org.springframework.util.StopWatch; public class PerformanceTest { public static void main(String[] args) { StopWatch stopWatch = new StopWatch(); stopWatch.start("Task1"); // 模拟任务1执行 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } stopWatch.stop(); stopWatch.start("Task2"); // 模拟任务2执行 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); // 输出格式化结果 } } ``` 上述代码中,`prettyPrint()` 方法将输出各任务的执行时间以及总时间,便于直观查看性能分布[^1]。 ### StopWatch 的适用场景 StopWatch 适用于需要对代码块进行简单计时的场景,例如性能测试、调试耗时操作、优化代码执行效率等。它特别适合用于 Spring 应用中对业务逻辑执行时间进行快速分析和诊断[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值