Java统计代码耗时
前言
Github:https://github.com/HealerJean
一、StopWatch
- Spring
⬤
StopWatch
对象不是设计为线程安全的,并且不使用同步。⬤ 一个
StopWatch
实例一次只能开启一个task
,不能同时start
多个task
⬤ 在该
task
还没stop
之前不能start
一个新的task
,必须在该task
stop
之后才能开启新的task⬤ 若要一次开启多个,需要
new
不同的StopWatch
实例
1、pom
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
2、TestMain
@Test
public void test() throws InterruptedException {
StopWatch stopWatch = new StopWatch();
// 任务一模拟休眠3秒钟
stopWatch.start("TaskOneName");
Thread.sleep(1000 * 3);
log.info("当前任务名称:{}", stopWatch.currentTaskName());
//当前任务名称:TaskOneName
if (stopWatch.isRunning()) {
stopWatch.stop();
}
// 任务一模拟休眠10秒钟
stopWatch.start("TaskTwoName");
Thread.sleep(1000 * 10);
log.info("当前任务名称:{}", stopWatch.currentTaskName());
//当前任务名称:TaskTwoName
if (stopWatch.isRunning()) {
stopWatch.stop();
}
// 打印出耗时
log.info("stopWatch.prettyPrint():{}", stopWatch.prettyPrint());
// stopWatch.prettyPrint():StopWatch '': running time (millis) = 13016
// -----------------------------------------
// ms % Task name
// -----------------------------------------
// 03015 023% TaskOneName
// 10001 077% TaskTwoName
log.info("stopWatch.shortSummary():{}", stopWatch.shortSummary());
// stopWatch.shortSummary():StopWatch '': running time (millis) = 13016
// stop后它的值为null
log.info("stopWatch.currentTaskName():{}", stopWatch.currentTaskName());
// stopWatch.currentTaskName():null
// 最后一个任务的相关信息
log.info("stopWatch.getLastTaskName():{}", stopWatch.getLastTaskName());
//stopWatch.getLastTaskName():TaskTwoName
log.info("stopWatch.getLastTaskInfo():{}", stopWatch.getLastTaskInfo());
// stopWatch.getLastTaskInfo():org.springframework.util.StopWatch$TaskInfo@73f792cf
// 任务总的耗时 如果你想获取到每个任务详情(包括它的任务名、耗时等等)可使用
log.info("所有任务总耗时:{}", stopWatch.getTotalTimeMillis());
// 所有任务总耗时13016
log.info("任务总数:{}", stopWatch.getTaskCount());
// 任务总数2
log.info("所有任务详情:{}", stopWatch.getTaskInfo());
// 所有任务详情org.springframework.util.StopWatch$TaskInfo@2ed94a8b
}
二、StopWatch.apache
@Test
public void test() throws InterruptedException {
//创建后立即start,常用
StopWatch watch = StopWatch.createStarted();
// StopWatch watch = new StopWatch();
// watch.start();
Thread.sleep(1000);
System.out.println(StrUtil.format("统计从开始到现在运行时间:{} ms", watch.getTime()));
// 统计从开始到现在运行时间:1006ms
// 复位后, 重新计时
watch.reset();
watch.start();
Thread.sleep(1000);
System.out.println(StrUtil.format("重新开始后到当前运行时间是:{} ms", watch.getTime()));
// 重新开始后到当前运行时间是:1006 ms
// 暂停 与 恢复
watch.suspend();
System.out.println("暂停2秒钟");
Thread.sleep(2000);
// 上面suspend,这里要想重新统计,需要恢复一下
watch.resume();
System.out.println(StrUtil.format("恢复后执行的时间是:{} ms", watch.getTime()));
// 恢复后执行的时间是:1001 ms
Thread.sleep(1000);
watch.stop();
// 花费的时间》》:2010 ms
System.out.println(StrUtil.format("花费的时间》》:{} ms", watch.getTime()));
// 花费的时间》》:2004 ms
// 转成 s
System.out.println(StrUtil.format("花费的时间》》:{} s", watch.getTime(TimeUnit.SECONDS)));
// 花费的时间》》:2 s
}
}