Java中如何计算一段程序的运行时间
作者:_码农耕地人 发布时间:2022-12-17 10:52:06
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"); // 单位为毫秒
来源:https://blog.csdn.net/weixin_60414376/article/details/123857483
猜你喜欢
- 一、概述在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依
- 一、数组创建1.1 声明并赋值int[] a = {1,2,3};1.2 声明数组名开辟空间并且赋值int[] a;a = new int[
- 1、声明一个测试对象import java.time.LocalDate;import java.util.List;import lomb
- 最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.cl
- 使用datatables自带后台查询 前台代码:<!DOCTYPE html><html><head>&
- 关于Maven的使用就不再啰嗦了,网上很多,并且这么多年变化也不大,这里仅介绍怎么搭建Hadoop的开发环境。1. 首先创建工程mvn ar
- 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow
- OAuth2简介OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),而在这个
- 1. 对象的创建对象创建的主要流程:1.类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引
- 简介我们在开发web应用的时候,有时候为了适应浏览器大小的调整,需要动态对页面的组件进行位置的调整。这时候就会用到flow layout,也
- 一、为什么按值调用和按引用调用?方法或函数可以通过两种方式调用。一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它
- 线程状态NEW:刚创建未启动的线程RUNNABLE:正在执行状态BLOCKED:处于阻塞状态的线程WAITING:正在等待另一个线程执行特定
- 抽象类和抽象方法常用知识点:(1)抽象类作为被继承类,子类必须实现抽象类中的所有抽象方法,除非子类也为抽象类。也就是说,如果子类也为抽象类,
- 前言做过java web开发的小伙伴大多数时候都需要链接数据库,这个时候就需要配置数据库引擎DriverClassName参数,这样我们的j
- INotifyPropertyChanged:该接口包含一个事件, 针对属性发生变更时, 执行该事件发生。// /
- JoinPoint的getSignature方法在使用springboot写aop的时候,有个JoinPoint类,用来获取代理类和被代理类
- 在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。使用流程【1】准备工作:在项目的工具包下导入HttpClient
- 我们通过项目的reimport等众多办法无法解决之后:假设这个是爆红的,因为被我已经解决了。我们进入到我们的本地仓库, 新建包。在repos
- Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java
- 本文主要研究的是关于Java中重载,重写,多态,静态绑定、动态绑定的相关内容,具体如下。重载,英文名是overload,是指在一个类中定义了