最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java代碼耗時(shí)統(tǒng)計(jì)的5種實(shí)現(xiàn)方式

 更新時(shí)間:2026年03月19日 16:30:13   作者:程序員一博  
這篇文章主要介紹了Java代碼耗時(shí)統(tǒng)計(jì)的5種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

代碼耗時(shí)統(tǒng)計(jì)的并不是某個(gè)方法的耗時(shí),而是任意代碼段之間的耗時(shí)。

這個(gè)代碼段,可能是一個(gè)方法中的幾行代碼,也有可能是從這個(gè)方法的某一行到另一個(gè)被調(diào)用方法的某一行,因此通過(guò) AOP 方式是不能實(shí)現(xiàn)這個(gè)需求的。

使用 System函數(shù)

public static void main(String[] args) {
    long  start = System.currentTimeMillis();
    try {
        // 模擬業(yè)務(wù)操作
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    long end = System.currentTimeMillis();
    System.out.println("耗時(shí):" + (end - start) + "ms");
}

或者

public static void main(String[] args) {
    long start = System.nanoTime();
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    long finish = System.nanoTime();

    long timeElapsed = finish - start;
    // 納秒
    System.out.println(timeElapsed);
}

使用 Instant.now()函數(shù)

public static void main(String[] args) {
    Instant start = Instant.now();
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();
    System.out.println(timeElapsed + "ms");
}

使用 Spring 框架提供的 StopWatch

public static void main(String[] args) {
    StopWatch watch = new StopWatch();
    watch.start("watcher");
    //some code
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    watch.stop();
    System.out.println(watch.prettyPrint());
}

使用 apache.commons 提供的 StopWatch

需要要入 apache.commons 依賴,用法上面的 spring 類似

java8 中的Function

在 jdk 1.8 中,引入了 java.util.function 包,通過(guò)該類提供的接口,能夠?qū)崿F(xiàn)在指定代碼段的上下文執(zhí)行額外代碼的功能。

public class TraceHolderTest {
    public static void main(String[] args) {
        TraceWatch traceWatch = new TraceWatch();

        TraceHolder.run(traceWatch, "function1", i -> {
            try {
                TimeUnit.SECONDS.sleep(1); // 模擬業(yè)務(wù)代碼
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        String result = TraceHolder.run(traceWatch, "function2", () -> {
            try {
                TimeUnit.SECONDS.sleep(1); // 模擬業(yè)務(wù)代碼
                return "YES";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "NO";
            }
        });

        TraceHolder.run(traceWatch, "function1", i -> {
            try {
                TimeUnit.SECONDS.sleep(1); // 模擬業(yè)務(wù)代碼
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println(JSON.toJSONString(traceWatch.getTaskMap()));
    }
}

/* output: 
{"function2":[{"data":1004,"taskName":"function2"}],"function1":[{"data":1001,"taskName":"function1"},{"data":1002,"taskName":"function1"}]}
*/
public class TraceHolder {
    /**
     * 有返回值調(diào)用
     */
    public static <T> T run(TraceWatch traceWatch, String taskName, Supplier<T> supplier) {
        try {
            traceWatch.start(taskName);

            return supplier.get();
        } finally {
            traceWatch.stop();
        }
    }

    /**
     * 無(wú)返回值調(diào)用
     */
    public static void run(TraceWatch traceWatch, String taskName, IntConsumer function) {
        try {
            traceWatch.start(taskName);

            function.accept(0);
        } finally {
            traceWatch.stop();
        }
    }
}

這里利用了 Supplier 和 IntConsumer 接口,對(duì)外提供了有返回值和無(wú)返回值得調(diào)用,在 TraceHolder 類中,在核心代碼塊的前后,分別調(diào)用了前文的 TraceWatch 的方法,實(shí)現(xiàn)了耗時(shí)統(tǒng)計(jì)的功能。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例

    Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例

    本篇文章主要介紹了Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Spring Boot 入門(mén)教程

    Spring Boot 入門(mén)教程

    相信很多人都接觸spring框架很長(zhǎng)時(shí)間了,每次搭建spring框架的時(shí)候都需要配置好多的jar、xml,做很多繁瑣重復(fù)的配置,稍微不留神就會(huì)出現(xiàn)各種各樣的問(wèn)題。今天給大家介紹一下如何利用Spring Boot快速的搭建一個(gè)簡(jiǎn)單的web應(yīng)用
    2017-03-03
  • Java輕松實(shí)現(xiàn)Excel與CSV格式互轉(zhuǎn)(含批量轉(zhuǎn)換)

    Java輕松實(shí)現(xiàn)Excel與CSV格式互轉(zhuǎn)(含批量轉(zhuǎn)換)

    在 Java 開(kāi)發(fā)中,經(jīng)常會(huì)遇到需要在 Excel 和 CSV 文件之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換的場(chǎng)景,本文將分享如何在 Java 中實(shí)現(xiàn)單文件和批量的 Excel 與 CSV 轉(zhuǎn)換方法,希望對(duì)大家有所幫助
    2025-09-09
  • 關(guān)于Future機(jī)制原理及解析

    關(guān)于Future機(jī)制原理及解析

    這篇文章主要介紹了關(guān)于Future機(jī)制原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java的微信開(kāi)發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例

    Java的微信開(kāi)發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例

    這篇文章主要介紹了Java微信開(kāi)發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例,注意一下json-lib所需要的jar包,需要的朋友可以參考下
    2016-02-02
  • Spring中的Sentinel熔斷降級(jí)詳解

    Spring中的Sentinel熔斷降級(jí)詳解

    這篇文章主要介紹了Spring中的Sentinel熔斷降級(jí)詳解,熔斷降級(jí)是一種保護(hù)系統(tǒng)穩(wěn)定性和可用性的機(jī)制,旨在防止故障的擴(kuò)散和蔓延,提高用戶體驗(yàn)和信任度,需要的朋友可以參考下
    2023-09-09
  • SpringBoot application.yml 最全避坑與多環(huán)境配置

    SpringBoot application.yml 最全避坑與多環(huán)境配置

    SpringBoot項(xiàng)目中,application.yml配置至關(guān)重要,涵蓋服務(wù)器端口、數(shù)據(jù)庫(kù)連接、第三方服務(wù)集成等配置,正確配置決定項(xiàng)目啟動(dòng)與穩(wěn)定運(yùn)行,本文詳細(xì)解析yml語(yǔ)法、多環(huán)境配置及敏感信息處理,助你高效編寫(xiě)、規(guī)避常見(jiàn)問(wèn)題
    2026-06-06
  • Java MyBatis框架環(huán)境搭建詳解

    Java MyBatis框架環(huán)境搭建詳解

    MyBatis本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis,MyBatis環(huán)境的搭建有點(diǎn)麻煩,本章帶你了解搭建過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2022-08-08
  • Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    這篇文章主要介紹了Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼,涉及樹(shù)節(jié)點(diǎn)的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問(wèn)題詳解

    Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問(wèn)題詳解

    約瑟夫(Josephus)問(wèn)題是單向環(huán)形鏈表的一種體現(xiàn),也就是丟手帕問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論

沂源县| 会理县| 卫辉市| 临夏县| 日照市| 普安县| 繁昌县| 临西县| 辛集市| 景德镇市| 蒙自县| 通山县| 宜都市| 莱阳市| 定日县| 南岸区| 平定县| 新余市| 佛教| 鹤峰县| 定边县| 凉城县| 广西| 无锡市| 正宁县| 阳泉市| 兰州市| 常宁市| 临桂县| 满城县| 习水县| 蕲春县| 新巴尔虎右旗| 阿鲁科尔沁旗| 凤台县| 新和县| 饶平县| 常州市| 嘉禾县| 甘谷县| 西平县|