求求你别再用 System.currentTimeMillis() 统计代码耗时了,真的太 Low 了!
阅读本文大概需要 5 分钟。
来自:blog.csdn.net/duleilewuhen/article/details/114379693
一、背景
public static void main(String[] args) { Long startTime = System.currentTimeMillis(); // 你的业务代码 Long endTime = System.currentTimeMillis(); Long elapsedTime = (endTime - startTime) / 1000; System.out.println("该段总共耗时:" + elapsedTime + "s");}这里重点讲下基于spring、Apache的使用
二、spring 用法
2.1 初遇
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency>
public static void main(String[] args) throws InterruptedException {StopWatch stopWatch = new StopWatch();// 任务一模拟休眠3秒钟stopWatch.start("TaskOneName");Thread.sleep(1000 * 3);System.out.println("当前任务名称:" + stopWatch.currentTaskName());stopWatch.stop();// 任务一模拟休眠10秒钟stopWatch.start("TaskTwoName");Thread.sleep(1000 * 10);System.out.println("当前任务名称:" + stopWatch.currentTaskName());stopWatch.stop();// 任务一模拟休眠10秒钟stopWatch.start("TaskThreeName");Thread.sleep(1000 * 10);System.out.println("当前任务名称:" + stopWatch.currentTaskName());stopWatch.stop();// 打印出耗时System.out.println(stopWatch.prettyPrint());System.out.println(stopWatch.shortSummary());// stop后它的值为nullSystem.out.println(stopWatch.currentTaskName());// 最后一个任务的相关信息System.out.println(stopWatch.getLastTaskName());System.out.println(stopWatch.getLastTaskInfo());// 任务总的耗时 如果你想获取到每个任务详情(包括它的任务名、耗时等等)可使用System.out.println("所有任务总耗时:" + sw.getTotalTimeMillis());System.out.println("任务总数:" + sw.getTaskCount());System.out.println("所有任务详情:" + sw.getTaskInfo());}
2.2 源码
public class StopWatch {/*** 本实例的唯一 Id,用于在日志或控制台输出时区分的。*/private final String id;/*** 是否保持一个 taskList 链表* 每次停止计时时,会将当前任务放入这个链表,用以记录任务链路和计时分析*/private boolean keepTaskList = true;/*** 任务链表* 用来存储每个task的信息, taskInfo由taskName 和 totoalTime组成*/private final List<StopWatch.TaskInfo> taskList;/*** 当前任务的开始时间*/private long startTimeMillis;/****/private boolean running;/*** 当前任务名称*/private String currentTaskName;/*** 最后一个任务的信息*/private StopWatch.TaskInfo lastTaskInfo;/*** 任务总数*/private int taskCount;/*** 程序执行时间*/private long totalTimeMillis;...}
接下来,我们看一下StopWatch类的构造器和一些关键方法

2.3 注意事项
StopWatch对象不是设计为线程安全的,并且不使用同步。 一个StopWatch实例一次只能开启一个task,不能同时start多个task 在该task还没stop之前不能start一个新的task,必须在该task stop之后才能开启新的task 若要一次开启多个,需要new不同的StopWatch实例
三、apache 用法

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.6</version></dependency>
Apache提供的这个任务执行监视器功能丰富强大,灵活性强,如下经典实用案例:
public static void main(String[] args) throws InterruptedException {//创建后立即start,常用StopWatch watch = StopWatch.createStarted();// StopWatch watch = new StopWatch();// watch.start();Thread.sleep(1000);System.out.println(watch.getTime());System.out.println("统计从开始到现在运行时间:" + watch.getTime() + "ms");Thread.sleep(1000);watch.split();System.out.println("从start到此刻为止的时间:" + watch.getTime());System.out.println("从开始到第一个切入点运行时间:" + watch.getSplitTime());Thread.sleep(1000);watch.split();System.out.println("从开始到第二个切入点运行时间:" + watch.getSplitTime());// 复位后, 重新计时watch.reset();watch.start();Thread.sleep(1000);System.out.println("重新开始后到当前运行时间是:" + watch.getTime());// 暂停 与 恢复watch.suspend();System.out.println("暂停2秒钟");Thread.sleep(2000);// 上面suspend,这里要想重新统计,需要恢复一下watch.resume();System.out.println("恢复后执行的时间是:" + watch.getTime());Thread.sleep(1000);watch.stop();System.out.println("花费的时间》》" + watch.getTime() + "ms");// 直接转成sSystem.out.println("花费的时间》》" + watch.getTime(TimeUnit.SECONDS) + "s");}
四、最后
推荐阅读:
现在我终于理解了“国企一万工资等于私企两万?” 在国企,钱真的很耐花!
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论


