日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用StopWatch監(jiān)控Java代碼運(yùn)行時(shí)間和分析性能

Android編程精選 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:獨(dú)淚了無(wú)痕 ? 2022-07-21 16:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

利用StopWatch監(jiān)控Java代碼運(yùn)行時(shí)間和分析性能

一、背景

有時(shí)我們?cè)谧鲩_(kāi)發(fā)的時(shí)候需要記錄每個(gè)任務(wù)執(zhí)行時(shí)間,或者記錄一段代碼執(zhí)行時(shí)間,最簡(jiǎn)單的方法就是打印當(dāng)前時(shí)間與執(zhí)行完時(shí)間的差值,一般我們檢測(cè)某段代碼執(zhí)行的時(shí)間,都是以如下方式來(lái)進(jìn)行的:

public static void main(String[] args) {  Long startTime = System.currentTimeMillis();  // 你的業(yè)務(wù)代碼  Long endTime = System.currentTimeMillis();  Long elapsedTime = (endTime - startTime) / 1000;  System.out.println("該段總共耗時(shí):" + elapsedTime + "s");}

事實(shí)上該方法通過(guò)獲取執(zhí)行完成時(shí)間與執(zhí)行開(kāi)始時(shí)間的差值得到程序的執(zhí)行時(shí)間,簡(jiǎn)單直接有效,但想必寫(xiě)多了也是比較煩人的,尤其是碰到不可描述的代碼時(shí),會(huì)更加的讓人忍不住多寫(xiě)幾個(gè)bug聊表敬意,而且如果想對(duì)執(zhí)行的時(shí)間做進(jìn)一步控制,則需要在程序中很多地方修改。

此時(shí)會(huì)想是否有一個(gè)工具類(lèi),提供了這些方法,剛好可以滿足這種場(chǎng)景?

我們可以利用已有的工具類(lèi)中的秒表,常見(jiàn)的秒表工具類(lèi)

有org.springframework.util.StopWatch、org.apache.commons.lang.time.StopWatch以及谷歌提供的guava中的秒表(這個(gè)我沒(méi)怎么用過(guò))

這里重點(diǎn)講下基于spring、Apache的使用

二、spring 用法

2.1 初遇

StopWatch 是位于 org.springframework.util 包下的一個(gè)工具類(lèi),通過(guò)它可方便的對(duì)程序部分代碼進(jìn)行計(jì)時(shí)(ms級(jí)別),適用于同步單線程代碼塊。簡(jiǎn)單總結(jié)一句,Spring提供的計(jì)時(shí)器StopWatch對(duì)于秒、毫秒為單位方便計(jì)時(shí)的程序,尤其是單線程、順序執(zhí)行程序的時(shí)間特性的統(tǒng)計(jì)輸出支持比較好。

也就是說(shuō)假如我們手里面有幾個(gè)在順序上前后執(zhí)行的幾個(gè)任務(wù),而且我們比較關(guān)心幾個(gè)任務(wù)分別執(zhí)行的時(shí)間占用狀況,希望能夠形成一個(gè)不太復(fù)雜的日志輸出,StopWatch提供了這樣的功能。而且Spring的StopWatch基本上也就是僅僅為了這樣的功能而實(shí)現(xiàn)。

想要使用它,首先你需要在你的 Maven 中引入 Spring 核心包,當(dāng)然 Spring MVC 和 Spring Boot 都已經(jīng)自動(dòng)引入了該包:

    org.springframework    spring-core    ${spring.version}

對(duì)一切事物的認(rèn)知,都是從使用開(kāi)始,那就先來(lái)看看它的用法,會(huì)如下所示:

public static void main(String[] args) throws InterruptedException {    StopWatch stopWatch = new StopWatch();
    // 任務(wù)一模擬休眠3秒鐘    stopWatch.start("TaskOneName");    Thread.sleep(1000 * 3);    System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());    stopWatch.stop();
    // 任務(wù)一模擬休眠10秒鐘    stopWatch.start("TaskTwoName");    Thread.sleep(1000 * 10);    System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());    stopWatch.stop();
    // 任務(wù)一模擬休眠10秒鐘    stopWatch.start("TaskThreeName");    Thread.sleep(1000 * 10);    System.out.println("當(dāng)前任務(wù)名稱:" + stopWatch.currentTaskName());    stopWatch.stop();
    // 打印出耗時(shí)    System.out.println(stopWatch.prettyPrint());    System.out.println(stopWatch.shortSummary());    // stop后它的值為null    System.out.println(stopWatch.currentTaskName()); 
    // 最后一個(gè)任務(wù)的相關(guān)信息    System.out.println(stopWatch.getLastTaskName());    System.out.println(stopWatch.getLastTaskInfo());
    // 任務(wù)總的耗時(shí)  如果你想獲取到每個(gè)任務(wù)詳情(包括它的任務(wù)名、耗時(shí)等等)可使用    System.out.println("所有任務(wù)總耗時(shí):" + sw.getTotalTimeMillis());    System.out.println("任務(wù)總數(shù):" + sw.getTaskCount());    System.out.println("所有任務(wù)詳情:" + sw.getTaskInfo());}

如圖所示,StopWatch 不僅正確記錄了上個(gè)任務(wù)的執(zhí)行時(shí)間,并且在最后還可以給出精確的任務(wù)執(zhí)行時(shí)間(納秒級(jí)別)和耗時(shí)占比,這或許就會(huì)比我們自己輸出要優(yōu)雅那么一些。

2.2 源碼

老規(guī)矩,由淺入深??赐暧梅?,我們來(lái)看看源碼。先看下組成 StopWatch 的屬性

public class StopWatch {    /**  * 本實(shí)例的唯一 Id,用于在日志或控制臺(tái)輸出時(shí)區(qū)分的。  */    private final String id;    /**  * 是否保持一個(gè) taskList 鏈表  * 每次停止計(jì)時(shí)時(shí),會(huì)將當(dāng)前任務(wù)放入這個(gè)鏈表,用以記錄任務(wù)鏈路和計(jì)時(shí)分析  */ private boolean keepTaskList = true;   /**  * 任務(wù)鏈表  * 用來(lái)存儲(chǔ)每個(gè)task的信息, taskInfo由taskName 和 totoalTime組成  */    private final List taskList;    /**  * 當(dāng)前任務(wù)的開(kāi)始時(shí)間  */    private long startTimeMillis;    /**  *   */    private boolean running;    /**  * 當(dāng)前任務(wù)名稱  */    private String currentTaskName;    /**  * 最后一個(gè)任務(wù)的信息  */    private StopWatch.TaskInfo lastTaskInfo;    /**  * 任務(wù)總數(shù)  */    private int taskCount;    /**  * 程序執(zhí)行時(shí)間  */    private long totalTimeMillis;    ...}

		
接下來(lái),我們看一下StopWatch類(lèi)的構(gòu)造器和一些關(guān)鍵方法

089914ba-0758-11ed-ba43-dac502259ad0.png

2.3 注意事項(xiàng)

  • StopWatch對(duì)象不是設(shè)計(jì)為線程安全的,并且不使用同步。
  • 一個(gè)StopWatch實(shí)例一次只能開(kāi)啟一個(gè)task,不能同時(shí)start多個(gè)task
  • 在該task還沒(méi)stop之前不能start一個(gè)新的task,必須在該task stop之后才能開(kāi)啟新的task
  • 若要一次開(kāi)啟多個(gè),需要new不同的StopWatch實(shí)例

三、apache 用法

StopWath是 apache commons lang3 包下的一個(gè)任務(wù)執(zhí)行時(shí)間監(jiān)視器,與我們平時(shí)常用的秒表的行為比較類(lèi)似,我們先看一下其中的一些重要方法:

08a97ee0-0758-11ed-ba43-dac502259ad0.png

    org.apache.commons    commons-lang3    3.6

		
Apache提供的這個(gè)任務(wù)執(zhí)行監(jiān)視器功能豐富強(qiáng)大,靈活性強(qiáng),如下經(jīng)典實(shí)用案例:
public static void main(String[] args) throws InterruptedException {    //創(chuàng)建后立即start,常用    StopWatch watch = StopWatch.createStarted();
    // StopWatch watch = new StopWatch();    // watch.start();
    Thread.sleep(1000);    System.out.println(watch.getTime());    System.out.println("統(tǒng)計(jì)從開(kāi)始到現(xiàn)在運(yùn)行時(shí)間:" + watch.getTime() + "ms");
    Thread.sleep(1000);    watch.split();    System.out.println("從start到此刻為止的時(shí)間:" + watch.getTime());    System.out.println("從開(kāi)始到第一個(gè)切入點(diǎn)運(yùn)行時(shí)間:" + watch.getSplitTime());    Thread.sleep(1000);    watch.split();    System.out.println("從開(kāi)始到第二個(gè)切入點(diǎn)運(yùn)行時(shí)間:" + watch.getSplitTime());
    // 復(fù)位后, 重新計(jì)時(shí)    watch.reset();    watch.start();    Thread.sleep(1000);    System.out.println("重新開(kāi)始后到當(dāng)前運(yùn)行時(shí)間是:" + watch.getTime());
    // 暫停 與 恢復(fù)    watch.suspend();    System.out.println("暫停2秒鐘");    Thread.sleep(2000);
    // 上面suspend,這里要想重新統(tǒng)計(jì),需要恢復(fù)一下    watch.resume();    System.out.println("恢復(fù)后執(zhí)行的時(shí)間是:" + watch.getTime());
    Thread.sleep(1000);    watch.stop();
    System.out.println("花費(fèi)的時(shí)間》》" + watch.getTime() + "ms");    // 直接轉(zhuǎn)成s    System.out.println("花費(fèi)的時(shí)間》》" + watch.getTime(TimeUnit.SECONDS) + "s");}

四、最后

很多時(shí)候,寫(xiě)代碼也是一種藝術(shù),而借助這種實(shí)用工具我就覺(jué)得藝術(shù)感更強(qiáng)些。希望我們能有追求更加美好事物的心,這點(diǎn)對(duì)于接納新知識(shí)特別重要。

此處推薦這個(gè)監(jiān)視器來(lái)代替之前的的使用,能讓小伙伴們更加靈活的分析你的代碼。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116874
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74419
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    16060
  • Apache
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    12944

原文標(biāo)題:求求你別再用 System.currentTimeMillis() 統(tǒng)計(jì)代碼耗時(shí)了,真的太 Low 了!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何縮短Vivado的運(yùn)行時(shí)間

    在Vivado Implementation階段,有時(shí)是有必要分析一下什么原因?qū)е?b class='flag-5'>運(yùn)行時(shí)間(runtime)過(guò)長(zhǎng),從而找到一些方法來(lái)縮短運(yùn)行時(shí)間。
    的頭像 發(fā)表于 05-29 14:37 ?1.6w次閱讀
    如何縮短Vivado的<b class='flag-5'>運(yùn)行時(shí)間</b>

    如何檢查L(zhǎng)inux服務(wù)器的運(yùn)行時(shí)間

    Linux 中的 uptime 用于查看系統(tǒng)啟動(dòng)后的運(yùn)行時(shí)間。它是一個(gè)比較簡(jiǎn)單的 Linux 命令,可以不帶參數(shù)直接運(yùn)行
    發(fā)表于 11-25 15:25 ?1.6w次閱讀
    如何檢查L(zhǎng)inux服務(wù)器的<b class='flag-5'>運(yùn)行時(shí)間</b>

    stm32cubeIDE代碼運(yùn)行時(shí)間如何查看?

    stm32cubeIDE 代碼運(yùn)行時(shí)間,如何查看?就如 keil 調(diào)試時(shí)候那樣,可以測(cè)試代碼運(yùn)行時(shí)間。但是在stm32cubeIDE 中,一直沒(méi)有找到這個(gè)功能,不知道哪位高人可以提示
    發(fā)表于 04-16 08:10

    請(qǐng)問(wèn)6747如何測(cè)量代碼運(yùn)行時(shí)間?

    1. 我想用片上的硬件定時(shí)器的方法測(cè)量代碼運(yùn)行時(shí)間,使用timer,加頭文件:csl_timer.h,但是6747沒(méi)有csl,我下載了6747的cslr package,發(fā)現(xiàn)里面也沒(méi)有
    發(fā)表于 07-28 10:25

    C語(yǔ)言教程之顯示程序運(yùn)行時(shí)間

    C語(yǔ)言教程之顯示程序運(yùn)行時(shí)間,很好的C語(yǔ)言資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-25 16:09 ?0次下載

    如何用SysTick實(shí)現(xiàn)測(cè)量程序運(yùn)行時(shí)間

    在實(shí)際的項(xiàng)目開(kāi)發(fā)過(guò)程中,常常遇到需要得到一段代碼運(yùn)行時(shí)間,通常的方法是用示波器來(lái)測(cè)量,這篇博文將用 SysTick 來(lái)實(shí)現(xiàn) 精確測(cè)量 程序運(yùn)行時(shí)間。 STM32F4 的內(nèi)核定時(shí)
    的頭像 發(fā)表于 05-09 14:07 ?6968次閱讀
    如何用SysTick實(shí)現(xiàn)測(cè)量程序<b class='flag-5'>運(yùn)行時(shí)間</b>

    KEIL的代碼運(yùn)行時(shí)間功能

    郭老師說(shuō),這個(gè)時(shí)間單位是秒(sec),是從單片機(jī)運(yùn)行第一條代碼開(kāi)始計(jì)算的,但是當(dāng)你真正用示波器驗(yàn)證這個(gè)時(shí)間差(因?yàn)椴恢绬纹瑱C(jī)什么時(shí)候才開(kāi)始運(yùn)行
    的頭像 發(fā)表于 06-05 15:48 ?1w次閱讀
    KEIL的<b class='flag-5'>代碼</b><b class='flag-5'>運(yùn)行時(shí)間</b>功能

    如何高效測(cè)量ECU的運(yùn)行時(shí)間

    ,最終可能會(huì)引起運(yùn)行時(shí)間方面的問(wèn)題。這在項(xiàng)目后期需要大量的時(shí)間和金錢(qián)來(lái)解決。如果不能掌握系統(tǒng)的運(yùn)行狀態(tài),則很難發(fā)現(xiàn)系統(tǒng)內(nèi)缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測(cè)量標(biāo)定硬件相結(jié)合,可同步
    的頭像 發(fā)表于 10-28 11:05 ?3263次閱讀

    淺析STM32代碼運(yùn)行時(shí)間的技巧

    前言 ????測(cè)試代碼運(yùn)行時(shí)間的兩種方法: 使用單片機(jī)內(nèi)部定時(shí)器,在待測(cè)程序段的開(kāi)始啟動(dòng)定時(shí)器,在待測(cè)程序段的結(jié)尾關(guān)閉定時(shí)器。為了測(cè)量的準(zhǔn)確性,要進(jìn)行多次測(cè)量,并進(jìn)行平均取值。 借助示波器的方法
    的頭像 發(fā)表于 11-09 09:52 ?4978次閱讀
    淺析STM32<b class='flag-5'>代碼</b><b class='flag-5'>運(yùn)行時(shí)間</b>的技巧

    AN021 測(cè)量MCU代碼運(yùn)行時(shí)間的幾種方法

    AN021 測(cè)量MCU代碼運(yùn)行時(shí)間的幾種方法
    發(fā)表于 02-27 18:23 ?0次下載
    AN021 測(cè)量MCU<b class='flag-5'>代碼</b><b class='flag-5'>運(yùn)行時(shí)間</b>的幾種方法

    ch32v307記錄程序運(yùn)行時(shí)間

    ,不僅會(huì)降低用戶的體驗(yàn),甚至可能會(huì)導(dǎo)致系統(tǒng)的崩潰。 因此,在程序設(shè)計(jì)和調(diào)試中,我們常常需要記錄程序的運(yùn)行時(shí)間,并通過(guò)不斷的優(yōu)化來(lái)提升程序的性能。本文將介紹如何在各種編程語(yǔ)言中記錄程序運(yùn)行時(shí)間,并分享一些提高程序
    的頭像 發(fā)表于 08-22 15:53 ?1938次閱讀

    如何保證它們?nèi)萜?b class='flag-5'>運(yùn)行時(shí)的安全?

    緊密耦合的容器運(yùn)行時(shí)繼承了主機(jī)操作系統(tǒng)的安全態(tài)勢(shì)和攻擊面。運(yùn)行時(shí)或主機(jī)內(nèi)核中的任何漏洞及其利用都會(huì)成為攻擊者的潛在切入點(diǎn)。
    的頭像 發(fā)表于 11-03 15:24 ?1633次閱讀

    如何在 CFD 設(shè)計(jì)中利用網(wǎng)格維護(hù)幾何形狀并減少運(yùn)行時(shí)間

    如何在 CFD 設(shè)計(jì)中利用網(wǎng)格維護(hù)幾何形狀并減少運(yùn)行時(shí)間?
    的頭像 發(fā)表于 11-24 17:07 ?1416次閱讀
    如何在 CFD 設(shè)計(jì)中<b class='flag-5'>利用</b>網(wǎng)格維護(hù)幾何形狀并減少<b class='flag-5'>運(yùn)行時(shí)間</b>?

    jvm運(yùn)行時(shí)內(nèi)存區(qū)域劃分

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),它是Java編程語(yǔ)言的運(yùn)行環(huán)境。JVM的主要功能是將Java
    的頭像 發(fā)表于 12-05 14:08 ?1245次閱讀

    三菱plc累計(jì)運(yùn)行時(shí)間怎么編程

    具有重要意義。本文將詳細(xì)介紹如何使用三菱PLC編程實(shí)現(xiàn)累計(jì)運(yùn)行時(shí)間的統(tǒng)計(jì)功能。 一、概述 累計(jì)運(yùn)行時(shí)間是指設(shè)備或系統(tǒng)在一定時(shí)間內(nèi)的總運(yùn)行時(shí)間。在工業(yè)生產(chǎn)中,對(duì)設(shè)備的累計(jì)
    的頭像 發(fā)表于 06-20 11:31 ?5309次閱讀
    文山县| 固始县| 池州市| 太仓市| 阜南县| 杭锦旗| 晴隆县| 东乌| 晋宁县| 于田县| 灵山县| 库车县| 庆安县| 石门县| 沽源县| 洮南市| 汾西县| 瑞昌市| 株洲县| 修水县| 长治市| 化隆| 弥勒县| 修水县| 西青区| 封丘县| 乐安县| 阿克| 本溪市| 高唐县| 涞源县| 田东县| 黄龙县| 南木林县| 北宁市| 康平县| 平陆县| 合水县| 琼海市| 永年县| 阳春市|