概述
今天学到的一个小技巧,使用spring自带的StopWatch优雅地统计各段代码的执行时间。
代码
package test;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;
import java.util.concurrent.TimeUnit;
/**
* @author xxxx
* @since 2023/5/29 15:46
*/
@Slf4j
public class Test20230529 {
public static void main(String[] args) throws InterruptedException {
StopWatch stopWatch = new StopWatch("统计程序执行时间");
stopWatch.start("逻辑1");
System.out.println("逻辑1============");
Thread.sleep(500);
stopWatch.stop();
stopWatch.start("逻辑2");
System.out.println("逻辑2============");
Thread.sleep(1000);
stopWatch.stop();
stopWatch.start("逻辑3");
System.out.println("逻辑3============");
Thread.sleep(1500);
stopWatch.stop();
stopWatch.start("逻辑4");
System.out.println("逻辑4============");
Thread.sleep(2000);
stopWatch.stop();
log.info(stopWatch.prettyPrint());
log.info(stopWatch.getId());
log.info("总时长:{}", stopWatch.getTotalTimeMillis());
}
}
执行结果
使用的时间单位是ms,可以统计各段代码的执行时间和占比。
转载来源:
B站:【排查某段代码执行时长的优雅方式!不会赶快点赞收藏吧!-哔哩哔哩】 https://b23.tv/OR8aAKh
补充
还可以这样写,将中间各个步骤打印
stopWatch.start("填充username");
// xx
stopWatch.stop();
stopWatch.start("填充机构名称");
// xx
stopWatch.stop();
stopWatch.start("填充 switchedOtherUrl");
// xx
stopWatch.stop();
for (StopWatch.TaskInfo taskInfo : stopWatch.getTaskInfo()) {
log.info("{}, {}s", taskInfo.getTaskName(), taskInfo.getTimeSeconds());
}
log.info("一共花费{}s", stopWatch.getTotalTimeSeconds());