Java中如何计算一段程序的运行时间

 更新时间:2023年03月01日 10:45:59   作者:_码农耕地人  
这篇文章主要介绍了Java中如何计算一段程序的运行时间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java计算一段程序的运行时间

介绍了两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算。

毫秒级别计算时间

        //初始时间
        long startTime = System.currentTimeMillis();
 
        /*要计算的程序部分*/
 
        //结束时间
        long endTime = System.currentTimeMillis();
        //打印
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");

更精确的纳秒

        long startTime_N=System.nanoTime();
        /*测试程序部分*/
        long endTime_N=System.nanoTime(); //获取结束时间
        System.out.println("程序运行时间: "+(endTime_N-startTime_N)+"ns");

Java程序运行时间统计

写代码特别是完成一些对时间要求比较高的任务时,我们经常需要统计程序运行时间。整体思路当然很简单,在程序开启和结束后分别记录当前时间,两者相减,就得到了程序运行时间。以下介绍一些常见方法,具体使用情况可以根据项目需要选择。

简单方法

1.1 System.currentTimeMillis()

大家第一印象肯定想到的是System.currentTimeMillis()。没错!这个可以用来做最简单的时间统计。

long start = System.currentTimeMillis();
// 业务逻辑代码...
long end = System.currentTimeMillis();
long timeElapsed = finish - end; // 单位为毫秒

System.currentTimeMillis()记录的是系统当前时间(Wall-clock Time)距离1970-1-1 00:00:00流逝的时间,单位是毫秒。系统当前时间具体什么意思呢,就是你操作系统中的时间。currentTimeMillis()并不是精确到1ms,而是跟操作系统具体实现有关。使用这个方法会存在问题,因为系统时间是可以随时调节的。比如:

  • 用户手动调节系统时间;
  • 系统自动根据时间服务器调节时间;
  • 有些有冬令时、夏令时的地区会自动调节时间;
  • 闰秒(Leap seconds),这个闰秒曾经导致很多系统挂掉。

所以这种方法如果用在开发阶段粗略估计时间是没有问题的,但是如果用到生产环境,就会存在很大的风险。

1.2 System.nanoTime()

nanoTime()与currentTimeMillis()正好相反,与系统时间完全无关,目的也正是用来统计程序耗时的。nanoTime()记录的是从某个固定的时刻起,到现在经过了多少纳秒。但是这个固定的时刻不是Unix时间戳的1970-1-1 00:00:00,而是启动虚拟机时生成的一个固定时刻,每个虚拟机的生成的这个时间都是不同的。

nanoTime()虽然精确到纳秒,但事实并不是每纳秒都跳动一格,而是可能在3纳秒之后,一下跳动3格。不过可以保证的是至少能跟currentTimeMillis()一样精确。

使用nanoTime()的统计方法跟currentTimeMillis()一样,如下:

long start = System.nonoTime();
// 业务逻辑代码...
long end = System.nonoTime();
long timeElapsed = finish - end; // 单位为纳秒

Java8以上

Java8以上定义了新的万年历,基于Java epoch,把一天精准地分为86400秒。使用新的Instant方法如下:

Instant start = Instant.now();
// 业务逻辑代码...
Instant end = Instant.now();
long timeElapsed = Duration.between(start, finish).toMillis(); // 单位为毫秒

第三方库StopWatch

StopWatch是Apache Commons Lang库内的一部分。可以用来方便地进行计时。

首先添加maven库:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

然后代码中:

StopWatch watch = new StopWatch();
watch.start();
// 业务逻辑代码...
watch.stop();
System.out.println("Time Elapsed: " + watch.getTime() + "ms"); // 单位为毫秒

总结

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

相关文章

  • Java经典设计模式之责任链模式原理与用法详解

    Java经典设计模式之责任链模式原理与用法详解

    这篇文章主要介绍了Java经典设计模式之责任链模式,简单说明了责任链模式的概念、原理,并结合实例形式分析了java实现责任链模式的具体用法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • 基于SpringBoot实现动态配置数据库的加载

    基于SpringBoot实现动态配置数据库的加载

    这篇文章主要介绍了Spring Boot 如何动态配置数据库的加载,现项目有一个需求,期望通过在application.yml配置文件中设置一个开关,来决定是否加载数据库,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java基础之文件概述

    Java基础之文件概述

    这篇文章主要介绍了Java基础之文件概述,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-05-05
  • Java继承的问题引导和测试代码

    Java继承的问题引导和测试代码

    这篇文章主要介绍了Java继承的问题引导和测试代码,涉及继承的概念,合成的语法等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2021-08-08
  • Springcloud服务注册consul客户端过程解析

    Springcloud服务注册consul客户端过程解析

    这篇文章主要介绍了Springcloud服务注册consul客户端过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java实现优雅停止线程的有效方法详解

    Java实现优雅停止线程的有效方法详解

    这篇文章主要为大家详细如何安全有效停止 Java 线程的,确保多线程应用程序平稳运行并实现最佳资源管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 在springboot中如何使用线程池

    在springboot中如何使用线程池

    在SpringBoot中,可以通过定义ThreadPoolTaskExecutor的Bean并使用@Autowired注入来使用线程池,具体步骤包括创建ThreadPoolTaskExecutor的Bean配置,本文给大家介绍springboot使用线程池的例子,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Maven打jar包的三种方式(小结)

    Maven打jar包的三种方式(小结)

    这篇文章主要介绍了Maven打jar包的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java运行时数据区概述详解

    Java运行时数据区概述详解

    这篇文章主要介绍了Java运行时数据区概述,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringCloud实战之Zuul网关服务

    SpringCloud实战之Zuul网关服务

    服务网关是分布式架构中不可缺少的组成部分,是外部网络和内部服务之间的屏障。这篇文章主要介绍了SpringCloud实战之Zuul网关服务。一起跟随小编过来看看吧
    2018-05-05

最新评论