成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Spring計時器StopWatch使用示例

瀏覽:171日期:2023-09-06 11:57:43

StopWatch是位于org.springframework.util包下的一個工具類,通過它可方便的對程序部分代碼進行計時(ms級別),適用于同步單線程代碼塊。

正常情況下,我們如果需要看某段代碼的執行耗時,會通過如下的方式進行查看:

public static void main(String[] args) throws InterruptedException { StopWatchTest.test0();// StopWatchTest.test1();}public static void test0() throws InterruptedException { long start = System.currentTimeMillis(); // do something Thread.sleep(100); long end = System.currentTimeMillis(); long start2 = System.currentTimeMillis(); // do something Thread.sleep(200); long end2 = System.currentTimeMillis(); System.out.println('某某1執行耗時:' + (end - start)); System.out.println('某某2執行耗時:' + (end2 - start2));}

運行結果:某某1執行耗時:105某某2執行耗時:203

該種方法通過獲取執行完成時間與執行開始時間的差值得到程序的執行時間,簡單直接有效,但想必寫多了也是比較煩人的,尤其是碰到不可描述的代碼時,會更加的讓人忍不住多寫幾個bug聊表敬意,而且該結果也不夠直觀,此時會想是否有一個工具類,提供了這些方法,或者自己寫個工具類,剛好可以滿足這種場景,并且把結果更加直觀的展現出來。 首先我們的需求如下:

記錄開始時間點 記錄結束時間點 輸出執行時間及各個時間段的占比

根據該需求,我們可直接使用org.springframework.util包下的一個工具類StopWatch,通過該工具類,我們對上述代碼做如下改造:

public static void main(String[] args) throws InterruptedException {// StopWatchTest.test0(); StopWatchTest.test1();}public static void test1() throws InterruptedException { StopWatch sw = new StopWatch('test'); sw.start('task1'); // do something Thread.sleep(100); sw.stop(); sw.start('task2'); // do something Thread.sleep(200); sw.stop(); System.out.println('sw.prettyPrint()~~~~~~~~~~~~~~~~~'); System.out.println(sw.prettyPrint());}

運行結果:sw.prettyPrint()~~~~~~~~~~~~~~~~~StopWatch ’test’: running time (millis) = 308-----------------------------------------ms % Task name-----------------------------------------00104 034% task100204 066% task2

start開始記錄,stop停止記錄,然后通過StopWatch的prettyPrint方法,可直觀的輸出代碼執行耗時,以及執行時間百分比,瞬間感覺比之前的方式高大上了一個檔次。

除此之外,還有以下兩個方法shortSummary,getTotalTimeMillis,查看程序執行時間。

運行代碼及結果:

System.out.println('sw.shortSummary()~~~~~~~~~~~~~~~~~');System.out.println(sw.shortSummary());System.out.println('sw.getTotalTimeMillis()~~~~~~~~~~~~~~~~~');System.out.println(sw.getTotalTimeMillis());

運行結果sw.shortSummary()~~~~~~~~~~~~~~~~~StopWatch ’test’: running time (millis) = 308sw.getTotalTimeMillis()~~~~~~~~~~~~~~~~~308

其實以上內容在該工具類中實現也極其簡單,通過start與stop方法分別記錄開始時間與結束時間,其中在記錄結束時間時,會維護一個鏈表類型的tasklist屬性,從而使該類可記錄多個任務,最后的輸出也僅僅是對之前記錄的信息做了一個統一的歸納輸出,從而使結果更加直觀的展示出來。

StopWatch優缺點:

優點:

spring自帶工具類,可直接使用 代碼實現簡單,使用更簡單 統一歸納,展示每項任務耗時與占用總時間的百分比,展示結果直觀 性能消耗相對較小,并且最大程度的保證了start與stop之間的時間記錄的準確性 可在start時直接指定任務名字,從而更加直觀的顯示記錄結果

缺點:

一個StopWatch實例一次只能開啟一個task,不能同時start多個task,并且在該task未stop之前不能start一個新的task,必須在該task stop之后才能開啟新的task,若要一次開啟多個,需要new不同的StopWatch實例 代碼侵入式使用,需要改動多處代碼

spring中StopWatch源碼實現如下:

import java.text.NumberFormat;import java.util.LinkedList;import java.util.List;public class StopWatch { private final String id; private boolean keepTaskList = true; private final List<TaskInfo> taskList = new LinkedList(); private long startTimeMillis; private boolean running; private String currentTaskName; private StopWatch.TaskInfo lastTaskInfo; private int taskCount; private long totalTimeMillis; public StopWatch() { this.id = ''; } public StopWatch(String id) { this.id = id; } public void setKeepTaskList(boolean keepTaskList) { this.keepTaskList = keepTaskList; } public void start() throws IllegalStateException { this.start(''); } public void start(String taskName) throws IllegalStateException { if (this.running) { throw new IllegalStateException('Can’t start StopWatch: it’s already running'); } else { this.startTimeMillis = System.currentTimeMillis(); this.running = true; this.currentTaskName = taskName; } } public void stop() throws IllegalStateException { if (!this.running) { throw new IllegalStateException('Can’t stop StopWatch: it’s not running'); } else { long lastTime = System.currentTimeMillis() - this.startTimeMillis; this.totalTimeMillis += lastTime; this.lastTaskInfo = new StopWatch.TaskInfo(this.currentTaskName, lastTime); if (this.keepTaskList) {this.taskList.add(this.lastTaskInfo); } ++this.taskCount; this.running = false; this.currentTaskName = null; } } public boolean isRunning() { return this.running; } public long getLastTaskTimeMillis() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task interval'); } else { return this.lastTaskInfo.getTimeMillis(); } } public String getLastTaskName() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task name'); } else { return this.lastTaskInfo.getTaskName(); } } public StopWatch.TaskInfo getLastTaskInfo() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task info'); } else { return this.lastTaskInfo; } } public long getTotalTimeMillis() { return this.totalTimeMillis; } public double getTotalTimeSeconds() { return (double) this.totalTimeMillis / 1000.0D; } public int getTaskCount() { return this.taskCount; } public StopWatch.TaskInfo[] getTaskInfo() { if (!this.keepTaskList) { throw new UnsupportedOperationException('Task info is not being kept!'); } else { return (StopWatch.TaskInfo[]) this.taskList.toArray(new StopWatch.TaskInfo[this.taskList.size()]); } } public String shortSummary() { return 'StopWatch ’' + this.id + '’: running time (millis) = ' + this.getTotalTimeMillis(); } public String prettyPrint() { StringBuilder sb = new StringBuilder(this.shortSummary()); sb.append(’n’); if (!this.keepTaskList) { sb.append('No task info kept'); } else { sb.append('-----------------------------------------n'); sb.append('ms % Task namen'); 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[] var7; int var6 = (var7 = this.getTaskInfo()).length; for (int var5 = 0; var5 < var6; ++var5) {StopWatch.TaskInfo task = var7[var5];sb.append(nf.format(task.getTimeMillis())).append(' ');sb.append(pf.format(task.getTimeSeconds() / this.getTotalTimeSeconds())).append(' ');sb.append(task.getTaskName()).append('n'); } } return sb.toString(); } @Override public String toString() { StringBuilder sb = new StringBuilder(this.shortSummary()); if (this.keepTaskList) { StopWatch.TaskInfo[] var5; int var4 = (var5 = this.getTaskInfo()).length; for (int var3 = 0; var3 < var4; ++var3) {StopWatch.TaskInfo task = var5[var3];sb.append('; [').append(task.getTaskName()).append('] took ').append(task.getTimeMillis());long percent = Math.round(100.0D * task.getTimeSeconds() / this.getTotalTimeSeconds());sb.append(' = ').append(percent).append('%'); } } else { sb.append('; no task info kept'); } return sb.toString(); } public static final class TaskInfo { private final String taskName; private final long timeMillis; TaskInfo(String taskName, long timeMillis) { this.taskName = taskName; this.timeMillis = timeMillis; } public String getTaskName() { return this.taskName; } public long getTimeMillis() { return this.timeMillis; } public double getTimeSeconds() { return (double) this.timeMillis / 1000.0D; } }}

到此這篇關于Spring計時器StopWatch使用示例的文章就介紹到這了,更多相關Spring計時器StopWatch內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品嫩草99a| 一区二区在线免费观看| 国产日韩欧美一区二区三区综合| 亚洲欧洲日韩在线| 国产一区二区三区免费在线观看| 亚洲欧美成人| 乱人伦精品视频在线观看| 亚洲视频中文字幕| 国模大胆一区二区三区| 国产精品色一区二区三区| 欧美在线播放| 久久久久久一级片| 不卡av电影在线播放| 先锋影音国产精品| 国产精品入口麻豆原神| 99国产精品视频免费观看| 3d成人h动漫网站入口| 亚洲成人tv网| 激情综合视频| 久久久久久久久一| 91在线观看一区二区| 欧美不卡一二三| 国产成人免费av在线| 日韩精品专区在线影院观看| 国产成人av在线影院| 日韩美女主播在线视频一区二区三区| 狠狠色2019综合网| 欧美日韩国产首页在线观看| 久久99久久久欧美国产| 在线观看一区日韩| 久久精品国产亚洲aⅴ | 99国产精品久久久久| 欧美丰满嫩嫩电影| 国产一区二区免费在线| 欧美一区二区黄| 懂色av中文字幕一区二区三区| 日韩欧美国产小视频| 成人免费高清视频| 精品1区2区在线观看| 91免费观看视频| 国产精品麻豆99久久久久久| 亚洲无线视频| 中文字幕一区二区三区在线观看| 国产一区再线| 亚洲欧洲性图库| 在线视频日韩| 午夜精品久久久久影视| 久久成人资源| 精品一区二区在线视频| 欧美一区二区三区播放老司机| 成人永久看片免费视频天堂| 精品国产露脸精彩对白| 欧美一区三区二区在线观看| 国产精品久久久久久久第一福利| 亚洲国产精品第一区二区三区| 亚洲一卡二卡三卡四卡| 欧美视频在线一区| 大白屁股一区二区视频| 国产色91在线| 亚洲高清av| 亚洲一区二区三区中文字幕 | 亚洲欧美日韩一区二区| 一区二区三区视频在线播放| 蜜桃精品在线观看| 日韩一二三区视频| 欧美日本一区二区视频在线观看 | 成人黄色网址在线观看| 自拍偷在线精品自拍偷无码专区| 久久中文精品| 粉嫩绯色av一区二区在线观看| 国产精品天干天干在线综合| 欧美综合77777色婷婷| 精久久久久久久久久久| 欧美一区中文字幕| 午夜久久黄色| 午夜精品免费在线| 精品日韩在线一区| 亚洲九九精品| 韩国一区二区视频| 国产精品欧美久久久久无广告| 久久成人免费| 99视频超级精品| 一级女性全黄久久生活片免费| 欧美日韩你懂得| 91老师国产黑色丝袜在线| 一区二区三区精品| 7777精品伊人久久久大香线蕉经典版下载| 99vv1com这只有精品| 亚洲视频电影在线| 3d动漫精品啪啪一区二区竹菊| 国产精品大全| 久久国产综合精品| 国产视频一区二区三区在线观看| 乱人伦精品视频在线观看| youjizz国产精品| 夜夜亚洲天天久久| 欧美成人艳星乳罩| 免费精品视频| 99精品久久久久久| 日韩国产一二三区| 国产三级欧美三级日产三级99| 久久国产精品一区二区三区| 成人黄色a**站在线观看| 樱花影视一区二区| 欧美一区二区免费| 欧美亚洲免费| 91麻豆福利精品推荐| 美女视频网站黄色亚洲| 亚洲人午夜精品天堂一二香蕉| 4438x亚洲最大成人网| 亚洲一区二区毛片| av中文字幕在线不卡| 美日韩一级片在线观看| 亚洲人成精品久久久久久| 7777精品伊人久久久大香线蕉完整版 | 国产欧美va欧美不卡在线| 日本道色综合久久| 国产精品播放| 国产福利一区在线| 亚洲成人午夜影院| 久久久久久久久久久久久女国产乱| 一本久久综合亚洲鲁鲁五月天| 91免费视频网| 秋霞午夜鲁丝一区二区老狼| 国产精品黄色在线观看| 欧美精品久久久久久久久老牛影院| 99精品国产在热久久婷婷| 成人av先锋影音| 久久国产生活片100| 一区av在线播放| 欧美高清在线一区二区| 欧美日韩免费高清一区色橹橹| 亚洲三级毛片| av一本久道久久综合久久鬼色| 美女视频一区二区| 一片黄亚洲嫩模| 国产精品欧美综合在线| 欧美一区二区精品久久911| 欧美综合天天夜夜久久| 国产精品久久久一区二区| 欧美午夜精彩| 成人app软件下载大全免费| 蜜桃视频在线观看一区二区| 亚洲欧洲精品一区二区三区| 精品国产区一区| 欧美男男青年gay1069videost| 久久精品盗摄| 国产精品久久久久久久久久直播 | 美国欧美日韩国产在线播放| 一区二区三区欧美亚洲| 欧美国产成人精品| 亚洲精品一线二线三线无人区| 欧美日韩aaa| 欧洲日韩一区二区三区| 久久久久久久久久久久久9999| 一区二区毛片| 精品二区视频| 国产精品hd| 91玉足脚交白嫩脚丫在线播放| 丰满岳乱妇一区二区三区| 黑人精品欧美一区二区蜜桃| 蜜臀av在线播放一区二区三区| 天天综合色天天综合色h| 亚洲电影欧美电影有声小说| 亚洲欧美色一区| 最新中文字幕一区二区三区| 亚洲国产高清aⅴ视频| 精品国产麻豆免费人成网站| 日韩欧美久久一区| 日韩精品一区二区三区蜜臀| 日韩三级在线观看| 日韩一区二区三区三四区视频在线观看 | 亚洲超碰97人人做人人爱| 亚洲自拍偷拍欧美| 一区二区三区久久久| 一区二区三区四区亚洲| 亚洲精品第一国产综合野| 亚洲免费在线视频一区 二区| 亚洲人吸女人奶水| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 中文字幕亚洲电影| 亚洲人成在线观看一区二区| 亚洲欧洲成人自拍| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 在线精品国精品国产尤物884a| 国产精品嫩草99av在线| 亚洲经典在线| 精品视频1区2区3区| 偷拍一区二区三区| 欧美精品日日鲁夜夜添| 天天免费综合色| 国产一区再线| 日韩欧美高清dvd碟片| 日韩伦理电影网| 国产成人自拍在线| 国产精品推荐精品| 国产精品欧美精品| 欧美一区二区久久| 欧美色区777第一页| 久久www成人_看片免费不卡|