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

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

Spring計時器StopWatch使用示例

瀏覽:225日期: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久久,三上悠亚国产精品一区二区三区
欧美三区四区| 国产农村妇女精品一区二区| 日韩激情啪啪| 一二三区精品| 亚洲精品乱码| 亚洲欧美在线综合| 亚洲精品自拍| 欧美亚洲国产日韩| 国产探花一区在线观看| 日本不卡一区二区三区| 亚洲毛片一区| 欧美日韩中出| 精品视频97| 精品一区二区三区的国产在线观看| 国产高清亚洲| 国产在线一区不卡| 日本不良网站在线观看| 亚洲不卡系列| 国产精品日本| 日韩高清成人在线| 麻豆久久久久久| 久久久久久夜| 香蕉国产精品| 日本综合精品一区| 国产精品亚洲综合色区韩国| 麻豆精品国产91久久久久久| 国产成人黄色| 自由日本语亚洲人高潮| 一区二区三区四区在线观看国产日韩| 亚久久调教视频| 精品一区二区三区免费看| 成人羞羞视频播放网站| 麻豆久久精品| 麻豆精品av| 欧美高清一区| 热久久久久久| av综合电影网站| 久久亚洲欧洲| 国产女人18毛片水真多18精品| 精品丝袜久久| 一本一道久久a久久精品蜜桃| 亚久久调教视频| 精品三级国产| 美女黄网久久| 国产精品成久久久久| 午夜日本精品| 久久国产精品色av免费看| 国产传媒在线| 亚洲字幕久久| 久久久久久一区二区| 日韩中文字幕1| 精品一区二区三区的国产在线观看| 免费精品国产| 麻豆91在线播放| 九色精品91| 欧美激情三区| 亚洲电影在线| 国产精品嫩草影院在线看| 久久久成人网| 青青国产91久久久久久| 蜜桃精品在线| 国产日韩高清一区二区三区在线| 激情久久五月| 国产精品一区二区精品视频观看| 99久久久久| 国产精品巨作av| 亚洲综合丁香| 97精品在线| 久久精品99国产精品| 国产99久久| 国产精品对白久久久久粗| 黄色日韩在线| 国产一区二区三区国产精品| 日韩精品一级| 好看不卡的中文字幕| 欧美国产视频| 视频一区中文字幕精品| 久久精品国产大片免费观看| 免费亚洲婷婷| 亚洲一区二区三区四区电影| 日韩在线短视频| 久久99国产精品视频| 日韩一区二区三区四区五区| 蜜桃成人av| 日韩电影免费网址| 国产乱码精品一区二区三区四区| 老鸭窝亚洲一区二区三区| 精品三级久久| 国产成人精品一区二区三区免费| 日本99精品| 中文亚洲免费| 色婷婷精品视频| 精品国产一级| 国产精品亲子伦av一区二区三区| 亚洲精品日本| 视频精品一区二区| 蜜桃视频欧美| 99精品国产一区二区三区| 久久麻豆视频| 国产免费久久| 亚洲精品伦理| 在线一区二区三区视频| 9国产精品视频| 在线日韩中文| 日韩一区自拍| 久久婷婷激情| 日韩欧美不卡| sm捆绑调教国产免费网站在线观看| 国产精品99久久免费观看| 日韩av不卡一区二区| 日本欧美在线看| 久热精品在线| 蜜桃视频一区二区三区在线观看| 99在线|亚洲一区二区| 99精品99| 亚洲欧洲一区二区天堂久久| 精品1区2区3区4区| 1024精品久久久久久久久| 亚洲特色特黄| 欧美日韩精品免费观看视频完整| 91精品蜜臀一区二区三区在线 | 日韩成人亚洲| 国产成人免费视频网站视频社区| 精品三区视频| 国产精品国产一区| 国产精久久久| 欧美成a人片免费观看久久五月天| 国产精品主播| 国产精品宾馆| 国产精品网站在线看| 你懂的网址国产 欧美| 精品视频99| 日韩中文在线播放| 亚洲精品成人| 久久最新视频| 综合激情网...| 欧美一级二区| 国产乱码精品一区二区三区四区| 久久只有精品| 亚洲精品88| 日韩成人亚洲| 日韩一级精品| 日韩欧美四区| 精品视频自拍| 天堂网av成人| 模特精品在线| 欧美在线精品一区| 美女视频网站久久| 国产成人精品亚洲日本在线观看| 136国产福利精品导航网址| 99国产精品久久久久久久| 亚洲理论在线| 久久不见久久见中文字幕免费| 国产一区二区三区四区| 精品捆绑调教一区二区三区 | 日韩午夜av| 午夜电影一区| 精品久久97| 91精品推荐| 亚洲免费一区三区| 久久女人天堂| 欧美特黄一级大片| 蜜桃av一区二区在线观看| 国产人成精品一区二区三| 国产一区精品福利| 黄色日韩在线| 国产日韩亚洲| 啪啪国产精品| 西西人体一区二区| 国产另类在线| 欧美日韩国产高清电影| 日韩二区三区在线观看| 在线手机中文字幕| 蜜桃视频在线观看一区二区| 乱一区二区av| 91精品二区| 欧美在线日韩| 成人va天堂| 91久久精品无嫩草影院| 岛国av免费在线观看| 另类av一区二区| 精品国产91| 免费视频一区二区| 国产精品成人自拍| 9色精品在线| 成人午夜毛片| 亚洲精品四区| 三上悠亚国产精品一区二区三区 | 久久免费国产| 欧美日韩中文| 欧美日韩国产一区精品一区| 国产精品日韩精品在线播放| 亚洲精品网址| 国精品产品一区| 亚洲精品日本| 久久精品国语| 巨乳诱惑日韩免费av| 老牛影视精品| 国产亚洲高清在线观看| 午夜国产欧美理论在线播放|