求求你别再用 System.currentTimeMillis() 统计代码耗时了,真的太 Low 了!
程序员的成长之路
共 5543字,需浏览 12分钟
·
2022-07-26 08:43
阅读本文大概需要 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后它的值为null
System.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 用法
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");
// 直接转成s
System.out.println("花费的时间》》" + watch.getTime(TimeUnit.SECONDS) + "s");
}
四、最后
推荐阅读:
现在我终于理解了“国企一万工资等于私企两万?” 在国企,钱真的很耐花!
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论