如何统计程序运行时间?
文章目录
在我们日常工作中,一般怎么计算一段代码的耗时?
System.currentTimeMillis(),相信大家不陌生,还有一种就是StopWatch
- 记录开始时间
- 记录结束时间
- 计算两者差值
public static void statisticsTime() throws InterruptedException { long start; long end; start = System.currentTimeMillis(); Thread.sleep(300); end = System.currentTimeMillis(); System.out.println("测试睡眠1耗时:" + (end - start) + "ms"); start = System.currentTimeMillis(); Thread.sleep(200); end = System.currentTimeMillis(); System.out.println("测试睡眠2耗时:" + (end - start) + "ms"); start = System.currentTimeMillis(); Thread.sleep(1000); end = System.currentTimeMillis(); System.out.println("测试睡眠3耗时:" + (end - start) + "ms"); }
测试睡眠1耗时:302ms 测试睡眠2耗时:201ms 测试睡眠3耗时:1000ms
一个计时工具类,有很多个,这里使用的是org.springframework.util包下的StopWatch
通过创建StopWatch,然后调用start方法和stop方法来记录时间,最后通过prettyPrint打印出统计分析信息。
public static void statisticsTimeByStopWatch() throws InterruptedException { StopWatch stopWatch = new StopWatch("测试"); stopWatch.start("测试睡眠1"); Thread.sleep(300); stopWatch.stop(); stopWatch.start("测试睡眠2"); Thread.sleep(200); stopWatch.stop(); stopWatch.start("测试睡眠3"); Thread.sleep(1000); stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); }
StopWatch '测试': running time (millis) = 1521 ----------------------------------------- ms % Task name ----------------------------------------- 00300 020% 测试睡眠1 00221 015% 测试睡眠2 01000 066% 测试睡眠3
可以直观看到总的耗时,以及各种组成部分的耗时,很方便
无论你用前面哪种方法,都会发生代码侵入,那有没有一种方式,可以不修改我们的代码?
一般在我们调试代码,都会用到debug,这里就可以配置debug来实现,主要使用的是断点里面的“Evaluate and log”public class StopWatchUtils { private static StopWatch stopWatch; public static void init(String name) { stopWatch = new StopWatch(name); } public static String start(String name) { stopWatch.start(name); return "Task name: " + name + " start " + System.currentTimeMillis(); } public static void stop() { stopWatch.stop(); } /** * 参考StopWatch.prettyPrint的代码 */ public static String print() { StringBuilder sb = new StringBuilder("StopWatch '" + stopWatch.getId() + "': running time (millis) = " + stopWatch.getTotalTimeMillis()); sb.append('\n'); sb.append("-----------------------------------------\n"); sb.append("ms % Task name\n"); sb.append("-----------------------------------------\n"); NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMinimumIntegerDigits(5); nf.setGroupingUsed(false); NumberFormat pf = NumberFormat.getPercentInstance(); pf.setMinimumIntegerDigits(3); pf.setGroupingUsed(false); StopWatch.TaskInfo[] var4 = stopWatch.getTaskInfo(); int var5 = var4.length; for (int var6 = 0; var6 < var5; ++var6) { StopWatch.TaskInfo task = var4[var6]; sb.append(nf.format(task.getTimeMillis())).append(" "); sb.append(pf.format(task.getTimeSeconds() / ((double) stopWatch.getTotalTimeMillis() /