Java使用StopWatch輸出執(zhí)行耗時(shí)的方法詳解
前言
在性能調(diào)優(yōu)和調(diào)試過程中,了解代碼執(zhí)行的時(shí)間非常重要。Spring 框架提供了一個(gè)名為 StopWatch
的工具類,用于簡化和標(biāo)準(zhǔn)化代碼執(zhí)行時(shí)間的測量。本文將詳細(xì)介紹如何使用 StopWatch
來輸出代碼執(zhí)行的耗時(shí)。
一、什么是 StopWatch
StopWatch
是 Spring 框架提供的一個(gè)輕量級工具類,用于測量代碼執(zhí)行時(shí)間。它允許我們方便地啟動、停止計(jì)時(shí),并輸出每個(gè)任務(wù)的執(zhí)行時(shí)間以及總時(shí)間。
二、StopWatch 的常用方法
2.1 創(chuàng)建 StopWatch 實(shí)例
可以通過無參構(gòu)造函數(shù)創(chuàng)建一個(gè) StopWatch
實(shí)例:
import org.springframework.util.StopWatch; StopWatch stopWatch = new StopWatch();
或者使用帶名稱的構(gòu)造函數(shù):
StopWatch stopWatch = new StopWatch("MyStopWatch");
2.2 啟動和停止計(jì)時(shí)
使用 start
方法啟動計(jì)時(shí):
stopWatch.start();
可以為每個(gè)任務(wù)指定名稱:
stopWatch.start("Task1");
使用 stop
方法停止計(jì)時(shí):
stopWatch.stop();
2.3 獲取計(jì)時(shí)結(jié)果
獲取每個(gè)任務(wù)的詳細(xì)信息:
StopWatch.TaskInfo[] taskInfos = stopWatch.getTaskInfo(); for (StopWatch.TaskInfo taskInfo : taskInfos) { System.out.println("Task name: " + taskInfo.getTaskName()); System.out.println("Time taken: " + taskInfo.getTimeMillis() + " ms"); }
獲取總時(shí)間:
System.out.println("Total time: " + stopWatch.getTotalTimeMillis() + " ms");
2.4 輸出計(jì)時(shí)結(jié)果
StopWatch
提供了多種格式化輸出方法:
System.out.println(stopWatch.prettyPrint());
或者:
System.out.println(stopWatch.shortSummary());
三、示例代碼
以下是一個(gè)完整的示例代碼,展示了如何使用 StopWatch
測量多個(gè)任務(wù)的執(zhí)行時(shí)間:
import org.springframework.util.StopWatch; public class StopWatchExample { public static void main(String[] args) throws InterruptedException { StopWatch stopWatch = new StopWatch("ExampleStopWatch"); stopWatch.start("Task1"); // 模擬任務(wù)1的執(zhí)行時(shí)間 Thread.sleep(500); stopWatch.stop(); stopWatch.start("Task2"); // 模擬任務(wù)2的執(zhí)行時(shí)間 Thread.sleep(300); stopWatch.stop(); stopWatch.start("Task3"); // 模擬任務(wù)3的執(zhí)行時(shí)間 Thread.sleep(700); stopWatch.stop(); // 輸出每個(gè)任務(wù)的詳細(xì)信息 StopWatch.TaskInfo[] taskInfos = stopWatch.getTaskInfo(); for (StopWatch.TaskInfo taskInfo : taskInfos) { System.out.println("Task name: " + taskInfo.getTaskName()); System.out.println("Time taken: " + taskInfo.getTimeMillis() + " ms"); } // 輸出總時(shí)間 System.out.println("Total time: " + stopWatch.getTotalTimeMillis() + " ms"); // 輸出格式化結(jié)果 System.out.println(stopWatch.prettyPrint()); } }
運(yùn)行結(jié)果示例
Task name: Task1
Time taken: 500 ms
Task name: Task2
Time taken: 300 ms
Task name: Task3
Time taken: 700 ms
Total time: 1500 msStopWatch 'ExampleStopWatch': running time (millis) = 1500
-----------------------------------------
ms % Task name
-----------------------------------------
00500 033% Task1
00300 020% Task2
00700 047% Task3
四、實(shí)踐應(yīng)用
4.1 復(fù)雜業(yè)務(wù)邏輯的性能分析
在處理復(fù)雜的業(yè)務(wù)邏輯時(shí),使用 StopWatch
可以幫助我們找到性能瓶頸。以下是一個(gè)實(shí)際應(yīng)用示例:
public void complexBusinessLogic() { StopWatch stopWatch = new StopWatch("ComplexBusinessLogic"); stopWatch.start("Initialization"); // 初始化操作 initialize(); stopWatch.stop(); stopWatch.start("DataProcessing"); // 數(shù)據(jù)處理操作 processData(); stopWatch.stop(); stopWatch.start("Finalization"); // 最終操作 finalizeProcess(); stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); } private void initialize() { // 模擬初始化時(shí)間 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } private void processData() { // 模擬數(shù)據(jù)處理時(shí)間 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } private void finalizeProcess() { // 模擬最終處理時(shí)間 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } }
4.2 API 調(diào)用耗時(shí)分析
在進(jìn)行 API 調(diào)用時(shí),使用 StopWatch
可以精確測量每個(gè) API 調(diào)用的耗時(shí),幫助優(yōu)化接口性能。
public void callApis() { StopWatch stopWatch = new StopWatch("APICalls"); stopWatch.start("API1"); // 調(diào)用第一個(gè)API callApi1(); stopWatch.stop(); stopWatch.start("API2"); // 調(diào)用第二個(gè)API callApi2(); stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); } private void callApi1() { // 模擬API調(diào)用時(shí)間 try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); } } private void callApi2() { // 模擬API調(diào)用時(shí)間 try { Thread.sleep(600); } catch (InterruptedException e) { e.printStackTrace(); } }
五、總結(jié)
通過本文的介紹,我們詳細(xì)講解了如何使用 StopWatch
類測量代碼執(zhí)行時(shí)間。StopWatch
提供了簡單而強(qiáng)大的功能,幫助我們精確分析代碼的性能瓶頸,優(yōu)化程序效率。希望本文能幫助您更好地理解和應(yīng)用 StopWatch
,在實(shí)際開發(fā)中提高代碼性能和質(zhì)量。
相關(guān)文章
Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)
SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了Spring Cloud Gateway不同頻率限流(每分鐘,每小時(shí),每天),需要的朋友可以參考下2020-10-10SpringBoot多租戶配置與實(shí)現(xiàn)示例
本文詳細(xì)介紹了在SpringBoot中實(shí)現(xiàn)多租戶架構(gòu)的方法和步驟,包括配置數(shù)據(jù)源、Hibernate攔截器、租戶解析器等,以共享數(shù)據(jù)庫、共享數(shù)據(jù)表的方式,確保數(shù)據(jù)隔離和安全性,感興趣的可以了解一下2024-09-09解決Maven項(xiàng)目加載spring bean的配置xml文件會提示找不到問題
這篇文章主要介紹了解決Maven項(xiàng)目加載spring bean的配置xml文件會提示找不到問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解
這篇文章主要為大家介紹了java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08SpringBoot通過計(jì)劃任務(wù)發(fā)送郵件提醒的代碼詳解
在實(shí)際線上項(xiàng)目中,有不斷接受到推送方發(fā)來的數(shù)據(jù)場景,而且是不間斷的發(fā)送,如果忽然間斷了,應(yīng)該是出問題了,需要及時(shí)檢查原因,這種情況比較適合用計(jì)劃任務(wù)做檢查判斷,出問題發(fā)郵件提醒,本文給大家介紹了SpringBoot通過計(jì)劃任務(wù)發(fā)送郵件提醒,需要的朋友可以參考下2024-11-11