Java代码耗时统计的5种实现方式

 更新时间:2026年03月19日 16:30:13   作者:程序员一博  
这篇文章主要介绍了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 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 包,通过该类提供的接口,能够实现在指定代码段的上下文执行额外代码的功能。

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 的方法,实现了耗时统计的功能。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java时间轮算法的实现代码示例

    Java时间轮算法的实现代码示例

    本篇文章主要介绍了Java时间轮算法的实现代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring Boot 入门教程

    Spring Boot 入门教程

    相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不留神就会出现各种各样的问题。今天给大家介绍一下如何利用Spring Boot快速的搭建一个简单的web应用
    2017-03-03
  • Java轻松实现Excel与CSV格式互转(含批量转换)

    Java轻松实现Excel与CSV格式互转(含批量转换)

    在 Java 开发中,经常会遇到需要在 Excel 和 CSV 文件之间进行数据转换的场景,本文将分享如何在 Java 中实现单文件和批量的 Excel 与 CSV 转换方法,希望对大家有所帮助
    2025-09-09
  • 关于Future机制原理及解析

    关于Future机制原理及解析

    这篇文章主要介绍了关于Future机制原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java的微信开发中使用XML格式和JSON格式数据的示例

    Java的微信开发中使用XML格式和JSON格式数据的示例

    这篇文章主要介绍了Java微信开发中使用XML格式和JSON格式数据的示例,注意一下json-lib所需要的jar包,需要的朋友可以参考下
    2016-02-02
  • Spring中的Sentinel熔断降级详解

    Spring中的Sentinel熔断降级详解

    这篇文章主要介绍了Spring中的Sentinel熔断降级详解,熔断降级是一种保护系统稳定性和可用性的机制,旨在防止故障的扩散和蔓延,提高用户体验和信任度,需要的朋友可以参考下
    2023-09-09
  • SpringBoot application.yml 最全避坑与多环境配置

    SpringBoot application.yml 最全避坑与多环境配置

    SpringBoot项目中,application.yml配置至关重要,涵盖服务器端口、数据库连接、第三方服务集成等配置,正确配置决定项目启动与稳定运行,本文详细解析yml语法、多环境配置及敏感信息处理,助你高效编写、规避常见问题
    2026-06-06
  • Java MyBatis框架环境搭建详解

    Java MyBatis框架环境搭建详解

    MyBatis本是apache的一个开源项目iBatis,MyBatis环境的搭建有点麻烦,本章带你了解搭建过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2022-08-08
  • Java中二叉树的建立和各种遍历实例代码

    Java中二叉树的建立和各种遍历实例代码

    这篇文章主要介绍了Java中二叉树的建立和各种遍历实例代码,涉及树节点的定义,后序遍历,层序遍历,深度优先和广度优先等相关内容,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java数据结构之环形链表和约瑟夫问题详解

    Java数据结构之环形链表和约瑟夫问题详解

    约瑟夫(Josephus)问题是单向环形链表的一种体现,也就是丢手帕问题,下面这篇文章主要给大家介绍了关于Java数据结构之环形链表和约瑟夫问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论