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
猜你喜欢
- package 移位运算;public class 移位运算 { public static void main(String[] args
- 树形结构很多地方都有应用,比如我们在构造网站后台的授权限树的时候,再比如我们在设计多级留言的时候、还有分类等等。有些时候我们的树形结构并不需
- 本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下:关于Delegate
- 本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,读取以及对于自定义的加密算法加密的参数如何保存和读取。背景为了安全的需要
- 本文实例为大家分享了Android实现快递物流时间轴效果展示的具体代码,供大家参考,具体内容如下首先,这篇参考了别人的代码。根据自己的项目需
- 基于jsr303 通过自定义注解实现,实现思路:存在一些瑕疵,后续补充完善。加入依赖部分版本已不默认自动引入该依赖,选择手动引入<de
- Logback 背景Logback是由log4j创始人设计的另一个开源日志组件,官方网站:http://logback.qos.ch。它当前
- 1.创建列表(列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建的这个列表要存储什么类型的)(泛型)//创建列表  
- 前言好记性不如烂笔头,日期时间类那么花哨不如记下来多看两眼。提示:以下是本篇文章正文内容,下面案例可供参考一.日期时间类的包代码如下(示例)
- 1.mybatis对多语句类型的支持在mybatis映射文件中传参数,主要用到#{} 或者 ${}.#{}:表示使用这种符号的变量会以预编译
- 前言异常崩溃,是Android项目中一项比较棘手的问题,即便做了很多的try - catch处理,也不能保证上线不会崩,而且一旦出现崩溃,就
- 本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式。所谓懒加载(lazy)就是延时加载,延迟加载。什么
- 本文实例讲述了C#实现图形位置组合转换的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.C
- ??Chip监听选中状态的监听:setOnCheckedChangeListener,该监听只有设置了checkable 属性为true或者
- 写在前面:可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答,那就是编写一个基于socket的聊天程序,正好最近刚用s
- 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考。具体用法分析如下:默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它。
- c#将字符串转换为大写或小写using System;using System.Collections.Generic;using Syst
- 起因我们先来看一个报错报错很简单,参数 start 没找到。我是在实现一个 API 接口时发现了一个问题,当我不使用 @Param 标签时,
- 前言前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询。而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联
- 本文实例为大家分享了C#实现图形界面的时钟的具体代码,供大家参考,具体内容如下秒针有跳跃两个格子问题,主要是算法耗时没考虑在TimeTick