代码中常规的耗时处理方法为:
long start = System.currentTimeMillis();
log.info("耗时{}毫秒", System.currentTimeMillis() - start);
Spring 提供了更好的一种实现方法,代码示例如下:
StopWatch watch = new StopWatch("耗时示例");
watch.start("开始点1");
TimeUnit.SECONDS.sleep(2);
watch.stop();
watch.start("开始点2");
TimeUnit.SECONDS.sleep(3);
watch.stop();
watch.start("开始点3");
TimeUnit.MILLISECONDS.sleep(1200);
watch.stop();
log.info(watch.prettyPrint());
代码执行后的输入日志为:
StopWatch '耗时示例': running time (millis) = 6201
-----------------------------------------
ms % Task name
-----------------------------------------
02000 032% 开始点1
03001 048% 开始点2
01200 019% 开始点3
哪种方法更优雅,更好使,不言而喻。
然后你可以使用拦截器或者过滤器,在起始的时候将StopWatch对象放入ThreadLocal中,然后封装一个工具类,就可以在业务代码的任何地方“打点”了,在过滤器或拦截器的收尾处打印计时统计。这样用来做代码性能分析应该不错。
在封装的工具类中建议使用debug日志级别,线上的在必要的时候热切换日志打印级别分析问题(此前发过一个帖子实现日志级别不停机热切换的)。
(END)