Java代碼耗時(shí)統(tǒng)計(jì)的5種實(shí)現(xiàn)方式
代碼耗時(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è)參考,也希望大家多多支持腳本之家。
- Java項(xiàng)目中統(tǒng)計(jì)代碼耗時(shí)的工具類
- 使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼
- 如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)
- Java統(tǒng)計(jì)代碼的執(zhí)行時(shí)間的N種方法
- java代碼實(shí)現(xiàn)C盤(pán)文件統(tǒng)計(jì)工具
- 利用Java簡(jiǎn)單實(shí)現(xiàn)一個(gè)代碼行數(shù)統(tǒng)計(jì)器方法實(shí)例
- java8 集合 多字段 分組 統(tǒng)計(jì)個(gè)數(shù)代碼
相關(guān)文章
Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例
本篇文章主要介紹了Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
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
Java的微信開(kāi)發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例
這篇文章主要介紹了Java微信開(kāi)發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例,注意一下json-lib所需要的jar包,需要的朋友可以參考下2016-02-02
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中二叉樹(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)題詳解
約瑟夫(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

