当前位置: 首页 > 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.dtcms.com/a/364188.html

相关文章:

  • 将 .vcproj 文件转换为 .pro 文件
  • Apache Doris:重塑湖仓一体架构的高效计算引擎
  • 常见机械机构的图graph表示
  • 【硬件测试】基于FPGA的16PSK+卷积编码Viterbi译码硬件片内测试,包含帧同步,信道,误码统计,可设置SNR
  • 新手也能懂的 MySQL 大表优化:40 字段表的规划思路 + 头表行表应用详解
  • Java8特性
  • MyBatis-Plus 实现用户分页查询(支持复杂条件)
  • TNNLS-2025《Metric Learning-Based Subspace Clustering》
  • 实训云上搭建分布式Hadoop集群[2025] 实战笔记
  • 图像编码--监控摄像机QP设置大小?
  • 构建可扩展的 AI 应用:LangChain 与 MCP 服务的集成模式
  • 用 map() + reduce() 搞定咖啡店订单结算:从发票到报表的 Python 实战
  • C19T1
  • leetcode567.字符串的排列
  • 2025 年行政岗转型突破:解锁技能提升新方向
  • 数据集格式化内容提要解析 (70)
  • Base64编码的作用与应用场景
  • SpringBoot 事务管理避坑指南
  • GitLens VS Code插件测评:助力代码协作高效查提交记录,轻松解决分支管理与代码冲突
  • RestTemplate 连接池怎么合理的使用
  • YOLOv8改进有效系列大全:从卷积到检测头的百种创新机制解析
  • 【邀请函】代码四合院,静候君至 | GitCodeAI社区升级发布会
  • ELF文件格式解析
  • 【代码随想录day 22】 力扣 131.分割回文串
  • 数据结构——树(03二叉树,与路径有关的问题,代码练习)
  • MySQL-表的约束(上)
  • 英伟达Jetson Orin NX-YOLOv8s目标检测模型耗时分析
  • 写论文先卡骨架再卡内容?一周出初稿爽翻!AI 帮我把骨架搭得明明白白,填内容超顺
  • 零样本视觉模型(DINOv3)
  • 从静态到智能:用函数式接口替代传统工具类