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%