一,前言
在java中,我们想看方法执行时间的时候,通常使用System.currentTimeMillis()方法分段打出日志查看,但是这样很不方便,执行时间需要自己计算输出!
二、介绍及核心API
StopWatch是位于org.apache.commons.lang3.time下的和时间有关的线程非安全的工具类。StopWatch为计时提供了很方便的API。StopWatch中提供的API都是成对使用的,比如有开始就有停止,有暂停就有恢复.....
三、功能介绍
start()
启动计时createStarted()
StopWatch的静态方法,创建和启动计时器二合一stop()
停止计时器reset()
重置计时器,可以理解将计时器所有状态数据清零为初始状态(包括停止计时),从而可以继续复用这个计时器(重置之后,若要启动计时需要重新调用start()开启计时)suspend()
暂停计时,此时计时器也将停止resume()
恢复计时,计时器重新开始计时split()
类似与暂停计时,但是它与暂停计时的区别在于,此时计时器还是正常计时的,只不过调用split()时相当于在此刻打了一个标记,然后在未来某个时间可以获取这个标记到开始计时之间的这段时间。unsplit()
与split()相反,用于清除上次split设置的标记
获取计时结果相关API
其主要核心的几个方法如下:
-
getTime()
-
getSplitTime()
-
getStartTime()
-
getStopTime()
-
formatTime()
-
formatSplitTime()
四、代码示例
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @描述:
* @Date: 2023/4/9
* @Description: // PC002
**/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class LisTest {
@Test
public void testStopWatch() throws InterruptedException {
// 计时测试
StopWatch stopWatch = StopWatch.createStarted();
Thread.sleep(2000);
log.info("事件一 >>> "+stopWatch.getTime());
// 重置测试,重置之后,不再计时
stopWatch.reset();
Thread.sleep(2000);
log.info("事件二 >>> "+stopWatch.getTime());
// 重新启动重置之后的计时器
stopWatch.start();
Thread.sleep(2000);
log.info("事件三 >>> "+stopWatch.getTime());
// 停止计时测试
stopWatch.stop();
Thread.sleep(2000);
log.info("事件四 >>> "+stopWatch.getTime());
}
}
输出
事件一 >>> 2011
事件二 >>> 0
事件三 >>> 2014
事件四 >>> 2014
五、org.springframework.util.StopWatch
spring自带工具类,可直接使用,统一归纳,展示每项任务耗时与占用总时间的百分比,展示结果直观,性能消耗相对较小,并且最大程度的保证了start与stop之间的时间记录的准确性,可在start时直接指定任务名字,从而更加直观的显示记录结果,相较于org.apache.commons.lang3.time.StopWatch,springframework.util.StopWatch效果最好,推荐使用
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StopWatch;
/**
* @描述:
* @Date: 2023/4/9
* @Description: // PC002
**/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class LisTest {
@Test
public void testStopWatch() throws InterruptedException {
StopWatch stopWatch = new StopWatch();
stopWatch.start("事件一");
Thread.sleep(2000);
stopWatch.stop();
log.info(stopWatch.getLastTaskName() + " 执行了 >>>> " + stopWatch.getLastTaskTimeMillis() + " 毫秒");
stopWatch.start("事件二");
Thread.sleep(2000);
stopWatch.stop();
log.info(stopWatch.getLastTaskName() + " 执行了 >>>> " + stopWatch.getLastTaskTimeMillis() + " 毫秒");
log.info(stopWatch.getTaskCount()+" 个任务总共执行了 >>> "+stopWatch.getTotalTimeMillis());
log.info(stopWatch.prettyPrint());
}
}
输出
事件一 执行了 >>>> 2010 毫秒
事件二 执行了 >>>> 2012 毫秒
2 个任务总共执行了 >>> 4022
StopWatch '': running time = 4022102600 ns
---------------------------------------------
ns % Task name
---------------------------------------------
2010042900 050% 事件一
2012059700 050% 事件二