1. import java.text.NumberFormat;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4.  
  5. public class StopWatch {
  6. private final String id;
  7. private boolean keepTaskList = true;
  8. private final List<TaskInfo> taskList = new LinkedList();
  9. private long startTimeMillis;
  10. private boolean running;
  11. private String currentTaskName;
  12. private StopWatch.TaskInfo lastTaskInfo;
  13. private int taskCount;
  14. private long totalTimeMillis;
  15.  
  16. public StopWatch() {
  17. this.id = "";
  18. }
  19.  
  20. public StopWatch(String id) {
  21. this.id = id;
  22. }
  23.  
  24. public void setKeepTaskList(boolean keepTaskList) {
  25. this.keepTaskList = keepTaskList;
  26. }
  27.  
  28. public void start() throws IllegalStateException {
  29. this.start("");
  30. }
  31.  
  32. public void start(String taskName) throws IllegalStateException {
  33. if (this.running) {
  34. throw new IllegalStateException("Can't start StopWatch: it's already running");
  35. } else {
  36. this.startTimeMillis = System.currentTimeMillis();
  37. this.running = true;
  38. this.currentTaskName = taskName;
  39. }
  40. }
  41.  
  42. public void stop() throws IllegalStateException {
  43. if (!this.running) {
  44. throw new IllegalStateException("Can't stop StopWatch: it's not running");
  45. } else {
  46. long lastTime = System.currentTimeMillis() - this.startTimeMillis;
  47. this.totalTimeMillis += lastTime;
  48. this.lastTaskInfo = new StopWatch.TaskInfo(this.currentTaskName, lastTime);
  49. if (this.keepTaskList) {
  50. this.taskList.add(this.lastTaskInfo);
  51. }
  52.  
  53. ++this.taskCount;
  54. this.running = false;
  55. this.currentTaskName = null;
  56. }
  57. }
  58.  
  59. public boolean isRunning() {
  60. return this.running;
  61. }
  62.  
  63. public long getLastTaskTimeMillis() throws IllegalStateException {
  64. if (this.lastTaskInfo == null) {
  65. throw new IllegalStateException("No tasks run: can't get last task interval");
  66. } else {
  67. return this.lastTaskInfo.getTimeMillis();
  68. }
  69. }
  70.  
  71. public String getLastTaskName() throws IllegalStateException {
  72. if (this.lastTaskInfo == null) {
  73. throw new IllegalStateException("No tasks run: can't get last task name");
  74. } else {
  75. return this.lastTaskInfo.getTaskName();
  76. }
  77. }
  78.  
  79. public StopWatch.TaskInfo getLastTaskInfo() throws IllegalStateException {
  80. if (this.lastTaskInfo == null) {
  81. throw new IllegalStateException("No tasks run: can't get last task info");
  82. } else {
  83. return this.lastTaskInfo;
  84. }
  85. }
  86.  
  87. public long getTotalTimeMillis() {
  88. return this.totalTimeMillis;
  89. }
  90.  
  91. public double getTotalTimeSeconds() {
  92. return (double) this.totalTimeMillis / 1000.0D;
  93. }
  94.  
  95. public int getTaskCount() {
  96. return this.taskCount;
  97. }
  98.  
  99. public StopWatch.TaskInfo[] getTaskInfo() {
  100. if (!this.keepTaskList) {
  101. throw new UnsupportedOperationException("Task info is not being kept!");
  102. } else {
  103. return (StopWatch.TaskInfo[]) this.taskList.toArray(new StopWatch.TaskInfo[this.taskList.size()]);
  104. }
  105. }
  106.  
  107. public String shortSummary() {
  108. return "StopWatch '" + this.id + "': running time (millis) = " + this.getTotalTimeMillis();
  109. }
  110.  
  111. public String prettyPrint() {
  112. StringBuilder sb = new StringBuilder(this.shortSummary());
  113. sb.append('\n');
  114. if (!this.keepTaskList) {
  115. sb.append("No task info kept");
  116. } else {
  117. sb.append("-----------------------------------------\n");
  118. sb.append("ms % Task name\n");
  119. sb.append("-----------------------------------------\n");
  120. NumberFormat nf = NumberFormat.getNumberInstance();
  121. nf.setMinimumIntegerDigits(5);
  122. nf.setGroupingUsed(false);
  123. NumberFormat pf = NumberFormat.getPercentInstance();
  124. pf.setMinimumIntegerDigits(3);
  125. pf.setGroupingUsed(false);
  126. StopWatch.TaskInfo[] var7;
  127. int var6 = (var7 = this.getTaskInfo()).length;
  128.  
  129. for (int var5 = 0; var5 < var6; ++var5) {
  130. StopWatch.TaskInfo task = var7[var5];
  131. sb.append(nf.format(task.getTimeMillis())).append(" ");
  132. sb.append(pf.format(task.getTimeSeconds() / this.getTotalTimeSeconds())).append(" ");
  133. sb.append(task.getTaskName()).append("\n");
  134. }
  135. }
  136.  
  137. return sb.toString();
  138. }
  139.  
  140. @Override
  141. public String toString() {
  142. StringBuilder sb = new StringBuilder(this.shortSummary());
  143. if (this.keepTaskList) {
  144. StopWatch.TaskInfo[] var5;
  145. int var4 = (var5 = this.getTaskInfo()).length;
  146.  
  147. for (int var3 = 0; var3 < var4; ++var3) {
  148. StopWatch.TaskInfo task = var5[var3];
  149. sb.append("; [").append(task.getTaskName()).append("] took ").append(task.getTimeMillis());
  150. long percent = Math.round(100.0D * task.getTimeSeconds() / this.getTotalTimeSeconds());
  151. sb.append(" = ").append(percent).append("%");
  152. }
  153. } else {
  154. sb.append("; no task info kept");
  155. }
  156.  
  157. return sb.toString();
  158. }
  159.  
  160. public static final class TaskInfo {
  161. private final String taskName;
  162. private final long timeMillis;
  163.  
  164. TaskInfo(String taskName, long timeMillis) {
  165. this.taskName = taskName;
  166. this.timeMillis = timeMillis;
  167. }
  168.  
  169. public String getTaskName() {
  170. return this.taskName;
  171. }
  172.  
  173. public long getTimeMillis() {
  174. return this.timeMillis;
  175. }
  176.  
  177. public double getTimeSeconds() {
  178. return (double) this.timeMillis / 1000.0D;
  179. }
  180. }
  181.  
  182. }

来源:https://blog.csdn.net/gxs1688/article/details/87185030

Spring StopWatch源码的更多相关文章

  1. 别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!

    大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源 ...

  2. Spring Boot源码分析-启动过程

    Spring Boot作为目前最流行的Java开发框架,秉承"约定优于配置"原则,大大简化了Spring MVC繁琐的XML文件配置,基本实现零配置启动项目. 本文基于Spring ...

  3. 曹工说Spring Boot源码(19)-- Spring 带给我们的工具利器,创建代理不用愁(ProxyFactory)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  4. Spring Boot系列(四):Spring Boot源码解析

    一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...

  5. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. spring事务源码研读1

    转载摘录自:Spring事务源码分析(一)Spring事务入门 有时为了保证一些操作要么都成功,要么都失败,这就需要事务来保证. 传统的jdbc事务如下: @Test public void test ...

  8. Spring IoC源码解决——工具篇Eclipse

    题外话 对于Spring框架,平时都是点到为止,停留在会用的程度.一直以来都想深入学习下,刚好最近看到<Spring源码深度解析>,所以想随着书本深入学习一下. 如果用Maven 如果使用 ...

  9. 深入Spring IOC源码之ResourceLoader

    在<深入Spring IOC源码之Resource>中已经详细介绍了Spring中Resource的抽象,Resource接口有很多实现类,我们当然可以使用各自的构造函数创建符合需求的Re ...

随机推荐

  1. c# 定制Equals()

  2. Hbase Region in transition问题解决

    1  hbase hbck -repair 强制修复 如果ok就可以 2 不ok,找到hdfs上对应的该表位置,删除,之后在使用hbase hbck -repair 解决过程: 第一次,使用了方法二, ...

  3. git命令——git status、git diff

    前言 当对项目做了更改时,我们通常需要知道具体改了哪些文件,哪些文件更改了没有暂存,哪些文件改了并且已加入到暂存区等待下次commit.上述任务使用git status都可以帮我们解决.但是想要知道文 ...

  4. 基于Java+Selenium的WebUI自动化测试框架(二)-----页面操作接口

    在有了基础的Position类之后,我们需要考虑我们在寻找完页面元素之后,需要做什么.这个“做”什么,可以理解为我们在页面上需要对应的一系列动作.比如:点击,输入,切换窗口,寻找元素,判断元素是否存在 ...

  5. JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql

    JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...

  6. SQL进阶17-变量的声明/使用(输出)--全局变量/会话变量--用户变量/局部变量

    /*进阶17 变量 系统变量: 全局变量: 会话变量: 自定义变量: 用户变量: 局部变量: */ /* #一: 系统变量 #说明: 变量由系统提供,不是用户定义的,属于服务器层面 #使用的语法 #1 ...

  7. 猜数游戏-人机对战-经典的randint使用

    翻阅去年的笔记,老师曾经教的random模块下的三种用法,其中之一是randint用法,今天上传,留作笔记参考.人生苦短,我用python! # -*- coding: UTF-8 -*- impor ...

  8. 前端学习笔记--html入门

    1.什么是html 2.标签和元素: 标签可嵌套,要注意缩进 html文档中的元素分为:内容文本.标签 3.标签和属性: 4.html的文件结构: 5.标签 a标签: 还不知道跳转到哪里,可以使用虚拟 ...

  9. Selenium常用API的使用java语言之5-selenium元素定位

    1.selenium定位方法 Selenium提供了8种定位方式. id name class name tag name link text partial link text xpath css ...

  10. Dao的扩展

    题目: 1.查询所有学生记录,包含年级名称2.查询S1年级下的学生记录 一.项目目录 package com.myschool.entity; import java.util.ArrayList; ...