java秒表stopwatch,

  java秒表stopwatch,

  00-1010序春秒表练习示例源代码分析lang3秒表总结

  00-1010正常情况下,我们要统计某个代码块或者某个方法的执行时间。最简单的方法如下。

  包com.chenpi/* * * @ author Chenpi * @ version 1.0 * @ description * @ date 2022/4/2 */public classchenpi { public static void main(string[]args)throws interrupted exception { long start time=system . current time millis();thread . sleep(1000);long end time=system . current time millis();System.out.println(执行时间(毫秒): (end time-start time));} }//输出结果如下:耗时执行(ms):1011。但是如果要对多个代码段进行计时,以及每个阶段计时的比例,如果还是采用上面的方法,就会被更多与业务无关的代码填充,不够简洁。

  

目录

Spring框架有一个工具类秒表,可以用来对程序中的代码块或方法进行计时,支持多阶段计时和统计阶段时间的比例。代码简洁,使用方便。

 

  包com.chenpi导入org . spring framework . util . stopwatch;/* * * @ author Chenpi * @ version 1.0 * @ description * @ date 2022/4/2 */public classchenpi { public static void main(string[]args)Throws interrupted exception {//Declare a timer stopwatch stopwatch=new stopwatch( timer of陈皮);//开始计时秒表. Start(发送MQ计时);thread . sleep(1000);//结束计时秒表. stop();//打印统计system . out . println(stopwatch . pretty print());} } //输出如下:秒表‘陈皮的计时器’3360运行时间=1005775500ns -。- 1005775500 100%发送MQ定时弹簧秒表有以下几种常用方法:

  StopWatch():构造一个计时器StopWatch(String id):构造一个具有指定id的计时器start():创建一个名为空字符串的定时任务并开始计时start(String taskName):创建一个具有指定名称的定时任务,开始计时stop():结束当前任务的计时getTotalTimeNanos():获取所有任务的执行时间,单位为纳秒getTotalTimeMillis():获取所有任务的执行时间, 以毫秒为单位shortSummary():获取简单的统计信息prettyPrint():以友好的方式输出总的统计时间,各阶段任务的执行时间setkeeptasklist(boolean keeptasklist):是否将每个任务存储在内部列表中。

  00-1010当程序中有多个定时器时,可以通过构造不同id的定时器来区分。下面演示几种不同的定时器,统计不同阶段的执行时间。

  包com.chenpi导入org . spring framework . util . stopwatch;/* * * @ author Chenpi * @ version 1.0 * @ description * @ date 2022/4/2 */public class Chenpi { public static void main(string[]args)抛出中断的异常{ m1();m2();}私营部门

  c void m1() throws InterruptedException {  // 声明一个计时器 StopWatch stopWatch = new StopWatch("m1计时器");  stopWatch.start("查询数据库"); Thread.sleep(1000); stopWatch.stop();  stopWatch.start("逻辑计算"); Thread.sleep(500); stopWatch.stop();  System.out.println(stopWatch.prettyPrint()); }  private static void m2() throws InterruptedException {  // 声明一个计时器 StopWatch stopWatch = new StopWatch("m2计时器");  stopWatch.start("远程调用"); Thread.sleep(800); stopWatch.stop();  stopWatch.start("发送MQ"); Thread.sleep(200); stopWatch.stop();  System.out.println(stopWatch.prettyPrint()); } }  // 输出结果如下 StopWatch m1计时器: running time = 1516953200 ns --------------------------------------------- ns % Task name --------------------------------------------- 1008091000 066% 查询数据库 508862200 034% 逻辑计算  StopWatch m2计时器: running time = 1013080000 ns --------------------------------------------- ns % Task name --------------------------------------------- 809345900 080% 远程调用 203734100 020% 发生MQ

 

  

源码分析

其实 StopWatch 底层实现很简单,对于每一个任务,在任务开始和结束时刻调用System.*nanoTime*()方法获取服务器当前的时间,然后计算每一个任务的执行时间,存储在内部。内部使用一个列表存储不同任务阶段的执行时间,最后打印输出。

 

  

package org.springframework.util;import java.text.NumberFormat;import java.util.ArrayList;import java.util.List;import java.util.concurrent.TimeUnit;import org.springframework.lang.Nullable;public class StopWatch {// 计时器idprivate final String id; // 是否将任务存储到任务列表中private boolean keepTaskList = true; // 存储全部任务的列表private final List<TaskInfo> taskList = new ArrayList<>(1);// 当前任务开始时间private long startTimeNanos;// 当前任务名称@Nullableprivate String currentTaskName; // 最后一个任务@Nullableprivate TaskInfo lastTaskInfo; // 总任务数private int taskCount;// 总的执行时间private long totalTimeNanos; // 构造一个id为空字符串的计时器public StopWatch() {this("");} // 构造一个指定id的计时器public StopWatch(String id) {this.id = id;} // 获取计时器idpublic String getId() {return this.id;}public void setKeepTaskList(boolean keepTaskList) {this.keepTaskList = keepTaskList;} // 开始计时public void start() throws IllegalStateException {start("");} // 开始一个指定任务名称的计时public void start(String taskName) throws IllegalStateException {if (this.currentTaskName != null) {throw new IllegalStateException("Cant start StopWatch: its already running");}this.currentTaskName = taskName;this.startTimeNanos = System.nanoTime();}// 停止任务计时public void stop() throws IllegalStateException {if (this.currentTaskName == null) {throw new IllegalStateException("Cant stop StopWatch: its not running");}long lastTime = System.nanoTime() - this.startTimeNanos;this.totalTimeNanos += lastTime;this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime);if (this.keepTaskList) {this.taskList.add(this.lastTaskInfo);}++this.taskCount;this.currentTaskName = null;}public boolean isRunning() {return (this.currentTaskName != null);}@Nullablepublic String currentTaskName() {return this.currentTaskName;}public long getLastTaskTimeNanos() throws IllegalStateException {if (this.lastTaskInfo == null) {throw new IllegalStateException("No tasks run: cant get last task interval");}return this.lastTaskInfo.getTimeNanos();}public long getLastTaskTimeMillis() throws IllegalStateException {if (this.lastTaskInfo == null) {throw new IllegalStateException("No tasks run: cant get last task interval");}return this.lastTaskInfo.getTimeMillis();}public String getLastTaskName() throws IllegalStateException {if (this.lastTaskInfo == null) {throw new IllegalStateException("No tasks run: cant get last task name");}return this.lastTaskInfo.getTaskName();}public TaskInfo getLastTaskInfo() throws IllegalStateException {if (this.lastTaskInfo == null) {throw new IllegalStateException("No tasks run: cant get last task info");}return this.lastTaskInfo;}public long getTotalTimeNanos() {return this.totalTimeNanos;}public long getTotalTimeMillis() {return nanosToMillis(this.totalTimeNanos);}public double getTotalTimeSeconds() {return nanosToSeconds(this.totalTimeNanos);}public int getTaskCount() {return this.taskCount;}public TaskInfo[] getTaskInfo() {if (!this.keepTaskList) {throw new UnsupportedOperationException("Task info is not being kept!");}return this.taskList.toArray(new TaskInfo[0]);}public String shortSummary() {return "StopWatch " + getId() + ": running time = " + getTotalTimeNanos() + " ns";}public String prettyPrint() {StringBuilder sb = new StringBuilder(shortSummary());sb.append(n);if (!this.keepTaskList) {sb.append("No task info kept");}else {sb.append("---------------------------------------------n");sb.append("ns % Task namen");sb.append("---------------------------------------------n");NumberFormat nf = NumberFormat.getNumberInstance();nf.setMinimumIntegerDigits(9);nf.setGroupingUsed(false);NumberFormat pf = NumberFormat.getPercentInstance();pf.setMinimumIntegerDigits(3);pf.setGroupingUsed(false);for (TaskInfo task : getTaskInfo()) {sb.append(nf.format(task.getTimeNanos())).append(" ");sb.append(pf.format((double) task.getTimeNanos() / getTotalTimeNanos())).append(" ");sb.append(task.getTaskName()).append(n);}}return sb.toString();}@Overridepublic String toString() {StringBuilder sb = new StringBuilder(shortSummary());if (this.keepTaskList) {for (TaskInfo task : getTaskInfo()) {sb.append("; [").append(task.getTaskName()).append("] took ").append(task.getTimeNanos()).append(" ns");long percent = Math.round(100.0 * task.getTimeNanos() / getTotalTimeNanos());sb.append(" = ").append(percent).append(%);}}else {sb.append("; no task info kept");}return sb.toString();}private static long nanosToMillis(long duration) {return TimeUnit.NANOSECONDS.toMillis(duration);}private static double nanosToSeconds(long duration) {return duration / 1_000_000_000.0;} // 任务实体public static final class TaskInfo { // 任务名称private final String taskName; // 任务执行时间private final long timeNanos;TaskInfo(String taskName, long timeNanos) {this.taskName = taskName;this.timeNanos = timeNanos;}public String getTaskName() {return this.taskName;}public long getTimeNanos() {return this.timeNanos;}public long getTimeMillis() {return nanosToMillis(this.timeNanos);}public double getTimeSeconds() {return nanosToSeconds(this.timeNanos);}}}复制代码

StopWatch 使用起来简洁,支持多任务阶段统计,统计多任务时间占比等,统计结果直观。但是它也有不好的地方,就是一个 StopWatch 实例只能同时 start 一个 task,只能等这个 task 进行 stop 之后,才能继续 start 另一个 task。注意,StopWatch 实例不是线程安全的,也没必要进行同步处理。

 

  

 

  

lang3 StopWatch

Apache commons lang3 包下也有一个用于计时工具类 StopWatch。它还有暂停计时,恢复计时,设置分割点等功能。

 

  

&nbsp;org.apache.commons:commons-lang3:3.12.0复制代码

它主要有以下几个常用方法:

 

  create():实例化一个计时器createStarted():实例化一个计时器,并开始计时StopWatch(final String message):实例化一个带有标识符的计时器start():开始计时split():设置分割点getSplitTime():统计从 start 开始最后一个分割点的用时reset():重置计时suspend():暂停计时resume():恢复计时stop():停止计时getTime():统计从 start 到当前时刻的同时

 package com.chenpi;  import org.apache.commons.lang3.time.StopWatch;  /** * @author 陈皮 * @version 1.0 * @description * @date 2022/4/2 */ public class ChenPi {  public static void main(String[] args) throws InterruptedException {  // 声明一个计时器 StopWatch stopWatch = new StopWatch("m1计时器");  stopWatch.start(); Thread.sleep(1000); System.out.println("start开始到现在的时间:" + stopWatch.getTime());  stopWatch.split(); Thread.sleep(500); System.out.println("start开始到最后一个split的时间:" + stopWatch.getSplitTime());  stopWatch.split(); Thread.sleep(500); System.out.println("start开始到最后一个split的时间:" + stopWatch.getSplitTime());  // 重置计时 stopWatch.reset(); Thread.sleep(2000); stopWatch.start(); Thread.sleep(1000); System.out.println("start开始到现在的时间:" + stopWatch.getTime());  // 暂停计时 stopWatch.suspend(); Thread.sleep(3000); // 恢复计时 stopWatch.resume();  Thread.sleep(1000);  // 结束计时 stopWatch.stop();  Thread.sleep(1000);  System.out.println("start开始到stop结束的时间:" + stopWatch.getTime());  System.out.println(stopWatch); } }  // 输出结果如下 start开始到现在的时间:1000 start开始到最后一个split的时间:1001 start开始到最后一个split的时间:1510 start开始到现在的时间:1004 start开始到stop结束的时间:2015 m1计时器 00:00:02.015

 

  

总结

如果是简单的计算执行计时,可以使用 JDK 自带的类获取系统时间进行计时。如果需要多阶段计时,并且需要统计每个阶段的执行时间占比等信息,可以使用 StopWatch 工具类。推荐使用 Spring StopWatch,因为本身我们项目使用 Spring 框架比较多,这样就自带了 StopWatch。到此这篇关于Java计时器工具StopWatch的具体使用的文章就介绍到这了,更多相关Java计时器工具StopWatch内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: