求求你別再用 System.currentTimeMillis() 統(tǒng)計代碼耗時了,真的太 Low 了!
閱讀本文大概需要 5 分鐘。
來自:blog.csdn.net/duleilewuhen/article/details/114379693
一、背景
public static void main(String[] args) { Long startTime = System.currentTimeMillis(); // 你的業(yè)務(wù)代碼 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();// 任務(wù)一模擬休眠3秒鐘stopWatch.start("TaskOneName");Thread.sleep(1000 * 3);System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());stopWatch.stop();// 任務(wù)一模擬休眠10秒鐘stopWatch.start("TaskTwoName");Thread.sleep(1000 * 10);System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());stopWatch.stop();// 任務(wù)一模擬休眠10秒鐘stopWatch.start("TaskThreeName");Thread.sleep(1000 * 10);System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());stopWatch.stop();// 打印出耗時System.out.println(stopWatch.prettyPrint());System.out.println(stopWatch.shortSummary());// stop后它的值為nullSystem.out.println(stopWatch.currentTaskName());// 最后一個任務(wù)的相關(guān)信息System.out.println(stopWatch.getLastTaskName());System.out.println(stopWatch.getLastTaskInfo());// 任務(wù)總的耗時 如果你想獲取到每個任務(wù)詳情(包括它的任務(wù)名、耗時等等)可使用System.out.println("所有任務(wù)總耗時:" + sw.getTotalTimeMillis());System.out.println("任務(wù)總數(shù):" + sw.getTaskCount());System.out.println("所有任務(wù)詳情:" + sw.getTaskInfo());}
2.2 源碼
public class StopWatch {/*** 本實例的唯一 Id,用于在日志或控制臺輸出時區(qū)分的。*/private final String id;/*** 是否保持一個 taskList 鏈表* 每次停止計時時,會將當(dāng)前任務(wù)放入這個鏈表,用以記錄任務(wù)鏈路和計時分析*/private boolean keepTaskList = true;/*** 任務(wù)鏈表* 用來存儲每個task的信息, taskInfo由taskName 和 totoalTime組成*/private final List<StopWatch.TaskInfo> taskList;/*** 當(dāng)前任務(wù)的開始時間*/private long startTimeMillis;/****/private boolean running;/*** 當(dāng)前任務(wù)名稱*/private String currentTaskName;/*** 最后一個任務(wù)的信息*/private StopWatch.TaskInfo lastTaskInfo;/*** 任務(wù)總數(shù)*/private int taskCount;/*** 程序執(zhí)行時間*/private long totalTimeMillis;...}
接下來,我們看一下StopWatch類的構(gòu)造器和一些關(guān)鍵方法

2.3 注意事項
StopWatch對象不是設(shè)計為線程安全的,并且不使用同步。 一個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提供的這個任務(wù)執(zhí)行監(jiān)視器功能豐富強大,靈活性強,如下經(jīng)典實用案例:
public static void main(String[] args) throws InterruptedException {//創(chuàng)建后立即start,常用StopWatch watch = StopWatch.createStarted();// StopWatch watch = new StopWatch();// watch.start();Thread.sleep(1000);System.out.println(watch.getTime());System.out.println("統(tǒng)計從開始到現(xiàn)在運行時間:" + 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());// 復(fù)位后, 重新計時watch.reset();watch.start();Thread.sleep(1000);System.out.println("重新開始后到當(dāng)前運行時間是:" + watch.getTime());// 暫停 與 恢復(fù)watch.suspend();System.out.println("暫停2秒鐘");Thread.sleep(2000);// 上面suspend,這里要想重新統(tǒng)計,需要恢復(fù)一下watch.resume();System.out.println("恢復(fù)后執(zhí)行的時間是:" + watch.getTime());Thread.sleep(1000);watch.stop();System.out.println("花費的時間》》" + watch.getTime() + "ms");// 直接轉(zhuǎn)成sSystem.out.println("花費的時間》》" + watch.getTime(TimeUnit.SECONDS) + "s");}
四、最后
推薦閱讀:
現(xiàn)在我終于理解了“國企一萬工資等于私企兩萬?” 在國企,錢真的很耐花!
互聯(lián)網(wǎng)初中高級大廠面試題(9個G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)??! 朕已閱
評論
圖片
表情


