日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Spring計時器StopWatch使用示例

瀏覽:224日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲高清影视| 国产精品国产一区| 伊人久久大香线蕉av超碰演员| 麻豆成人在线观看| 久久精品色播| 高清日韩欧美| 久久精品成人| 日韩午夜高潮| 最新国产精品| 欧美日韩精品一区二区三区视频| 国产无遮挡裸体免费久久| 国产精品三p一区二区| 麻豆精品在线播放| 成人福利av| 蜜臀av免费一区二区三区| 久久国产99| 国产香蕉精品| 亚洲欧洲美洲av| 免费在线小视频| 亚洲精品网址| 中文字幕日韩高清在线| 日本午夜精品视频在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产精品久久久网站| 久久久久久一区二区| 久久精品影视| 中文字幕一区二区三区四区久久| 国产欧美日韩亚洲一区二区三区| 国产一区二区精品久| 激情五月综合网| 日韩欧美中文在线观看| 久久三级毛片| 久久精品av| 国产精品婷婷| 国产精品videossex| 日本高清不卡一区二区三区视频| 国产精品三上| 国产精品久久久久久久久久白浆 | 久久久久久免费视频| 夜夜精品视频| 欧美日韩午夜| 国产美女高潮在线| 1024精品久久久久久久久| 亚洲人妖在线| 国产一区二区三区天码| re久久精品视频| 日本午夜精品视频在线观看| 首页国产精品| 日韩在线一区二区| 精品福利久久久| 亚洲综合电影一区二区三区| 免费在线欧美黄色| 最新亚洲激情| 国产精品欧美一区二区三区不卡| 五月激情久久| 国产欧美自拍| 亚洲深夜av| 老司机精品在线| 国产精品日本| 欧美国产一级| 日韩精品电影一区亚洲| 久久激情网站| 久久av网站| 蜜桃伊人久久| av日韩中文| 日本va欧美va瓶| 日韩国产一区二区| 日本午夜精品一区二区三区电影 | 久久亚洲成人| 国产精品极品在线观看| 香蕉成人久久| 国产日韩电影| 国产精品sss在线观看av| 99国产精品久久久久久久成人热| 久久国产精品美女| 亚洲乱亚洲高清| 国产一区视频在线观看免费| 久久av资源| 亚洲精品日本| 午夜久久99| 91亚洲一区| 久久精品72免费观看| 久久都是精品| 免费视频亚洲| 日韩一区二区三区在线免费观看| 国产精品夜夜夜| 日韩国产91| 视频一区二区三区中文字幕| 性感美女一区二区在线观看| 老司机精品视频网| 欧美精品三级在线| 日韩午夜视频在线| 亚洲一区av| 亚洲欧洲一区二区天堂久久| 欧洲精品一区二区三区| 黄色网一区二区| 青草国产精品| 日韩精品国产欧美| 亚洲视频电影在线| 野花国产精品入口| 欧美日韩国产在线观看网站 | 久久久久网站| 伊人网在线播放| 精品国产亚洲一区二区三区大结局| 欧美视频精品全部免费观看| 日韩欧美在线精品| 无码日韩精品一区二区免费| 视频一区免费在线观看| 中文日韩欧美| 亚洲手机视频| 国产伊人精品| 久久国产日本精品| 亚洲日本网址| 九九精品调教| 日产精品一区| 日韩不卡免费高清视频| 日韩免费福利视频| 三上悠亚国产精品一区二区三区| 欧美aa一级| 日韩在线观看一区| 色天使综合视频| 99久久www免费| 欧美精品一二| 亚洲一区二区成人| 99国产精品视频免费观看一公开 | 亚洲精品九九| 日韩在线观看中文字幕| 日韩精品一级| 日韩中文字幕视频网| 日本免费一区二区视频| 日韩高清三区| 国产精品一区二区精品视频观看| 国产精品亚洲综合在线观看| 国产精品久久久久久久久久白浆 | 亚洲精品欧美| 国产亚洲一卡2卡3卡4卡新区| 69堂精品视频在线播放| 国产极品一区| 97精品中文字幕| 久久影院一区| 日韩亚洲国产欧美| 亚洲欧洲日韩精品在线| 日韩av中文在线观看| 国产精品成人**免费视频| 色综合狠狠操| 影音国产精品| 日韩精品一区二区三区中文 | 蜜桃久久久久| 中国字幕a在线看韩国电影| 欧美亚洲激情| 亚洲精品人人| 精品一区视频| 久久视频精品| 日本亚洲视频在线| 国产一区精品福利| 国产精品99一区二区| 99在线|亚洲一区二区| 日韩精品乱码av一区二区| 国际精品欧美精品| 红桃视频欧美| 国产日韩在线观看视频| av资源亚洲| 日韩制服丝袜先锋影音| 麻豆成人av在线| 欧美午夜不卡| 国产精品久久久久毛片大屁完整版| 91av亚洲| 中文字幕日韩高清在线| 久久99国产精品视频| japanese国产精品| 国产乱论精品| 日韩免费久久| 日韩激情中文字幕| 女生影院久久| 亚洲精品欧洲| 毛片在线网站| 午夜精品影视国产一区在线麻豆| 福利视频一区| 亚洲三级毛片| 婷婷激情一区| 欧美日韩亚洲一区| 一区二区小说| 国产精品亚洲片在线播放| 日韩精品一区二区三区免费观影| 亚洲精品字幕| 在线一区视频观看| 日韩极品在线观看| 亚洲国内欧美| 欧美精品不卡| 亚洲无线观看| 日韩国产网站| 国产精品亚洲人成在99www| 91久久国产| 精品五月天堂| 亚洲精品一区二区在线播放∴| 伊人久久国产| 国产亚洲观看| 视频一区视频二区中文| 日韩欧美精品一区| 国产欧美日韩一区二区三区在线|