当前位置: 首页 > news >正文

Java代码耗时统计的5种方法

代码耗时统计的并不是某个方法的耗时,而是任意代码段之间的耗时。这个代码段,可能是一个方法中的几行代码,也有可能是从这个方法的某一行到另一个被调用方法的某一行,因此通过 AOP 方式是不能实现这个需求的。

使用 System函数

public static void main(String[] args) {long  start = System.currentTimeMillis();try {// 模拟业务操作Thread.sleep(1000L);} catch (InterruptedException e) {throw new RuntimeException(e);}long end = System.currentTimeMillis();System.out.println("耗时:" + (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()函数

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 codetry {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 包,通过该类提供的接口,能够实现在指定代码段的上下文执行额外代码的功能。

public class TraceHolderTest {public static void main(String[] args) {TraceWatch traceWatch = new TraceWatch();TraceHolder.run(traceWatch, "function1", i -> {try {TimeUnit.SECONDS.sleep(1); // 模拟业务代码} catch (InterruptedException e) {e.printStackTrace();}});String result = TraceHolder.run(traceWatch, "function2", () -> {try {TimeUnit.SECONDS.sleep(1); // 模拟业务代码return "YES";} catch (InterruptedException e) {e.printStackTrace();return "NO";}});TraceHolder.run(traceWatch, "function1", i -> {try {TimeUnit.SECONDS.sleep(1); // 模拟业务代码} 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 {/*** 有返回值调用*/public static <T> T run(TraceWatch traceWatch, String taskName, Supplier<T> supplier) {try {traceWatch.start(taskName);return supplier.get();} finally {traceWatch.stop();}}/*** 无返回值调用*/public static void run(TraceWatch traceWatch, String taskName, IntConsumer function) {try {traceWatch.start(taskName);function.accept(0);} finally {traceWatch.stop();}}
}

这里利用了 Supplier 和 IntConsumer 接口,对外提供了有返回值和无返回值得调用,在 TraceHolder 类中,在核心代码块的前后,分别调用了前文的 TraceWatch 的方法,实现了耗时统计的功能。

http://www.xdnf.cn/news/1434295.html

相关文章:

  • docker redis容器命令行操作
  • # pdf.js完全指南:构建现代Web PDF查看与解析解决方案
  • flume扩展实战:自定义拦截器、Source 与 Sink 全指南
  • 基于SQLite索引的智能图片压缩存储系统设计与实现
  • 【Vue】前端 vue2项目搭建入门级(二)
  • Arduino Uno与4×4矩阵键盘联动完全指南
  • Day11--HOT100--25. K 个一组翻转链表,138. 随机链表的复制,148. 排序链表
  • 模拟在线测试中相关语句的应用
  • Python如何处理非标准JSON
  • 百度网盘基于Flink的实时计算实践
  • Markdown格式.md文件的编辑预览使用
  • 【Java基础|第三十二篇】增强流、缓冲流、标准流、转换流
  • 【Qt】bug排查笔记——QMetaObject::invokeMethod: No such method
  • Telnet 原理与配置
  • Deepin25安装mysql8.4.5
  • 【鸿蒙面试题-6】LazyForEach 懒加载
  • MQTT报文的数据结构
  • LeeCode104. 二叉树的最大深度,LeeCode111. 二叉树的最小深度
  • 动手学深度学习
  • 2025年IT行业女性职业发展证书选择指南
  • 企业微信怎么用能高效获客?拆解体检品牌如何实现私域营收提升
  • ReactAgent接入MCP服务工具
  • WMT2014:机器翻译领域的“奥林匹克盛会“
  • 【Unity开发】丧尸围城项目实现总结
  • 双八无碳小车cad+三维图+仿真+设计说明书
  • 快速入门Vue3——基础语法
  • SpringBoot RestTemplate 设置http请求连接池
  • 一个真正跨平台可用的免费PDF解决方案
  • 同步整流芯片为何容易受损?如何应对呢?
  • 第十七讲:编译链接与函数栈帧