20200110 org.springframework.util.StopWatch

简介

简单的秒表,允许为多个任务计时,公开总运行时间和每个命名任务的运行时间。
隐藏System.nanoTime()的使用,从而提高了应用程序代码的可读性并减少了计算错误的可能性。

请注意,此对象并非设计为线程安全的,并且不使用同步。
此类通常用于在概念验证工作和开发过程中验证性能,而不是作为生产应用程序的一部分。

从Spring Framework 5.2开始,以纳秒为单位跟踪和报告运行时间。

使用

  • StopWatch:构造器,可指定StopWatch的id,默认为空字符串("")
  • getId:获取StopWatch的id,可通过构造函数指定,没有setter方法,默认为""
  • setKeepTaskList:设置keepTaskList属性,默认为true,如果设置为false,调用 getTaskInfo() 会报错,调用 prettyPrint() 时,打印内容格式为:
StopWatch 'test': running time = 300520200 ns
No task info kept
  • start:StopWatch 开始运行任务,可以通过入参指定 taskName,默认为空字符串("")

  • currentTaskName:返回当前运行任务的taskName,如果StopWatch当前不在运行中,返回null

  • isRunning:返回StopWatch是否仍在运行,在start()stop()之间调用为true,否则为false

  • stop:StopWatch 停止执行任务

  • getTaskInfo:以数组形式返回StopWatch的taskList,如果keepTaskList属性为false,抛出异常

  • getTaskCount:返回StopWatch的任务数量

  • getLastTaskInfo:返回上一个任务信息(TaskInfo对象),如果之前没有运行过任务,即没有调用过stop(),抛出异常

  • getLastTaskName:返回上一个任务的任务名称,即taskName

  • getLastTaskTimeNanos:返回上一个任务的运行时间,单位为ns

  • getLastTaskTimeMillis:返回上一个任务的运行时间,单位为ms

  • getTotalTimeNanos:返回StopWatch的总运行时间,单位为ns

  • getTotalTimeMillis:返回StopWatch的总运行时间,单位为ms

  • getTotalTimeSeconds:返回StopWatch的总运行时间,单位为s

  • prettyPrint:返回格式化后的StopWatch的所有任务的执行信息,格式为:

StopWatch 'test': running time = 300009200 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
100146000  033%  task1
199863200  067%  task2
  • shortSummary:返回StopWatch运行时间的简单描述
  • toString:返回StopWatch的所有任务的简单执行信息

示例

StopWatch sw = new StopWatch("test");
System.out.println("id = " + sw.getId()); // id = test

// sw.setKeepTaskList(false);

sw.start("task1");
{
    // do something
    System.out.println("currentTaskName = " + sw.currentTaskName()); // currentTaskName = task1
}
Thread.sleep(100);
sw.stop();

StopWatch.TaskInfo lastTaskInfo = sw.getLastTaskInfo();
System.out.println("TimeSeconds = " + lastTaskInfo.getTimeSeconds()); // TimeSeconds = 0.1001189
System.out.println("LastTaskName = " + sw.getLastTaskName()); // LastTaskName = task1
System.out.println("LastTaskTimeMillis = " + sw.getLastTaskTimeMillis()); // LastTaskTimeMillis = 100
System.out.println("LastTaskTimeNanos = " + sw.getLastTaskTimeNanos()); // LastTaskTimeNanos = 100118900

sw.start("task2");
{
    // do something
    System.out.println("currentTaskName = " + sw.currentTaskName()); // currentTaskName = task2
    System.out.println("isRunning = " + sw.isRunning()); // isRunning = true
}
Thread.sleep(200);
sw.stop();

System.out.println("currentTaskName = " + sw.currentTaskName()); // currentTaskName = null

System.out.println(sw.prettyPrint());

/*
StopWatch 'test': running time = 300009200 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
100146000  033%  task1
199863200  067%  task2
 */

System.out.println("shortSummary = " + sw.shortSummary()); // StopWatch 'test': running time = 300458499 ns
System.out.println("getTaskCount = " + sw.getTaskCount()); // 2
System.out.println("getTotalTimeSeconds = " + sw.getTotalTimeSeconds() + " s"); // 0.301075301 s
System.out.println("getTotalTimeMillis = " + sw.getTotalTimeMillis() + " ms"); // 300 ms
System.out.println("getTotalTimeNanos = " + sw.getTotalTimeNanos() + " ns"); // 301075301 ns
System.out.println("isRunning = " + sw.isRunning()); // false

System.out.println(sw); // StopWatch 'test': running time = 300361899 ns; [task1] took 99972100 ns = 33%; [task2] took 200389799 ns = 67%

原文地址:https://www.cnblogs.com/huangwenjie/p/12177597.html