Java 實(shí)用工具類Spring 的 StopWatch常用方法
前言
在日常開(kāi)發(fā)中,我們經(jīng)常需要對(duì)代碼的執(zhí)行耗時(shí)進(jìn)行監(jiān)控和分析。Spring 提供了一個(gè)輕量級(jí)的計(jì)時(shí)工具類:org.springframework.util.StopWatch
,可以非常方便地實(shí)現(xiàn)多個(gè)任務(wù)的精確耗時(shí)統(tǒng)計(jì),尤其適用于性能調(diào)優(yōu)與調(diào)試分析場(chǎng)景。
一、StopWatch 簡(jiǎn)介
StopWatch
是 Spring Core 中的一個(gè)實(shí)用類,用于對(duì)代碼執(zhí)行過(guò)程中的多個(gè)階段進(jìn)行計(jì)時(shí)和結(jié)果統(tǒng)計(jì)。它支持任務(wù)分段記錄、總耗時(shí)統(tǒng)計(jì)、任務(wù)名稱記錄等功能。
二、StopWatch 的常用方法
1. 構(gòu)造方法
StopWatch stopWatch = new StopWatch("performance-monitor");
參數(shù)可選,用于命名當(dāng)前計(jì)時(shí)器。
2. 開(kāi)始一個(gè)任務(wù)
stopWatch.start("task1");
開(kāi)始記錄一個(gè)任務(wù),并命名該任務(wù)。
3. 停止當(dāng)前任務(wù)
stopWatch.stop();
停止當(dāng)前正在記錄的任務(wù)。
4. 判斷狀態(tài)
stopWatch.isRunning();
判斷當(dāng)前是否還有任務(wù)在運(yùn)行。
5. 獲取統(tǒng)計(jì)信息
stopWatch.prettyPrint(); // 打印所有任務(wù)及耗時(shí)信息(格式化) stopWatch.getTotalTimeMillis(); // 總耗時(shí)(毫秒) stopWatch.getTaskCount(); // 獲取任務(wù)數(shù)
6. 獲取具體任務(wù)信息
TaskInfo[] tasks = stopWatch.getTaskInfo(); for (TaskInfo task : tasks) { System.out.println(task.getTaskName() + ": " + task.getTimeMillis()); }
三、常見(jiàn)使用場(chǎng)景
1. 性能瓶頸排查
在復(fù)雜方法中插入多個(gè) stopWatch.start("stepX")
記錄各階段耗時(shí)。
StopWatch sw = new StopWatch(); sw.start("loadDb"); loadFromDatabase(); sw.stop(); sw.start("parseJson"); parseJsonData(); sw.stop(); System.out.println(sw.prettyPrint());
2. 接口性能統(tǒng)計(jì)
可用于攔截器、過(guò)濾器等,對(duì)接口整體和各子流程耗時(shí)進(jìn)行統(tǒng)計(jì)。
3. 單元測(cè)試性能分析
在測(cè)試代碼中評(píng)估某個(gè)方法調(diào)用的穩(wěn)定性和耗時(shí)情況。
4. 多線程任務(wù)分析(注意線程隔離)
在并發(fā)場(chǎng)景下,不建議多個(gè)線程共用一個(gè) StopWatch
實(shí)例,應(yīng)為每個(gè)線程獨(dú)立創(chuàng)建實(shí)例。
四、與 System.currentTimeMillis() 的對(duì)比優(yōu)勢(shì)
功能 | System.currentTimeMillis() | StopWatch |
---|---|---|
API 簡(jiǎn)潔 | 非常原始 | 封裝好任務(wù)名、階段 |
支持多任務(wù) | 手動(dòng)維護(hù)多個(gè)變量 | 內(nèi)部支持任務(wù)堆棧 |
輸出格式 | 自定義打印 | prettyPrint 統(tǒng)一美觀 |
可讀性 | 差 | 高,可讀性好 |
五、總結(jié)
StopWatch
是 Spring 框架中極其實(shí)用的開(kāi)發(fā)輔助工具,它為性能分析和調(diào)試提供了輕量但強(qiáng)大的能力,使用簡(jiǎn)單、無(wú)需復(fù)雜配置。
建議在接口調(diào)用鏈、框架擴(kuò)展點(diǎn)、自定義組件等性能敏感區(qū)域,結(jié)合日志系統(tǒng)或 APM 工具使用 StopWatch
,幫助我們?cè)陂_(kāi)發(fā)階段快速定位瓶頸、量化優(yōu)化效果。
貼士:不要在生產(chǎn)環(huán)境中濫用
StopWatch.prettyPrint()
,可以定向輸出日志或結(jié)合自定義日志格式收集信息更為合適。
到此這篇關(guān)于Java 實(shí)用工具類:Spring 的 StopWatch的文章就介紹到這了,更多相關(guān)java StopWatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談web服務(wù)器項(xiàng)目中request請(qǐng)求和response的相關(guān)響應(yīng)處理
這篇文章主要介紹了淺談web服務(wù)器項(xiàng)目中request請(qǐng)求和response的相關(guān)響應(yīng)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07springboot利用aspose預(yù)覽office文件的實(shí)現(xiàn)過(guò)程
這篇文章主要給大家介紹了關(guān)于springboot利用aspose預(yù)覽office文件的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友可以參考下2021-06-06詳解SpringBoot集成消息隊(duì)列的案例應(yīng)用
Message?Queue又名消息隊(duì)列,是一種異步通訊的中間件。可以理解為郵局,發(fā)送者將消息投遞到郵局,然后郵局幫我們發(fā)送給具體的接收者,具體發(fā)送過(guò)程和時(shí)間與我們無(wú)關(guān)。?消息隊(duì)列是分布式系統(tǒng)中重要的組件,消息隊(duì)列主要解決了應(yīng)用耦合、異步處理、流量削鋒等問(wèn)題2022-04-04解決logback-classic 使用testCompile的打包問(wèn)題
這篇文章主要介紹了解決logback-classic 使用testCompile的打包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07關(guān)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制
今天小編就為大家分享一篇關(guān)于關(guān)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01SpringBoot配置多數(shù)據(jù)源的四種方式分享
在日常開(kāi)發(fā)中我們都是以單個(gè)數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā),在小型項(xiàng)目中是完全能夠滿足需求的,但是,當(dāng)我們牽扯到大型項(xiàng)目的時(shí)候,單個(gè)數(shù)據(jù)庫(kù)就難以承受用戶的CRUD操作,那么此時(shí),我們就需要使用多個(gè)數(shù)據(jù)源進(jìn)行讀寫分離的操作,本文就給大家介紹SpringBoot配置多數(shù)據(jù)源的方式2023-07-07基于Listener監(jiān)聽(tīng)器生命周期(詳解)
下面小編就為大家?guī)?lái)一篇基于Listener監(jiān)聽(tīng)器生命周期(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10一文詳細(xì)講解Java的父子繼承、方法的重寫與super關(guān)鍵字
Java中繼承是通過(guò)extends關(guān)鍵字實(shí)現(xiàn),幫助減少代碼重復(fù),提高復(fù)用性,子類繼承父類的屬性和方法,但私有成員除外,方法重寫(override)使子類改造父類方法以適應(yīng)新功能,這篇文章主要介紹了Java的父子繼承、方法的重寫與super關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2024-10-10