SpringIOC工具类之任务执行时间监视器StopWatch

前言

StopWatchspring-core包下的一个工具类,他可以帮助我们对一个或者多个任务的运行时间进行统计。

一、源码

public class StopWatch {
     

	//id,只有get方法
	private final String id;

	private boolean keepTaskList = true;
    //储存每个任务的信息
	private final List<TaskInfo> taskList = new LinkedList<>();

	//每个任务的开始时间
	private long startTimeNanos;

	//当前任务的名字,只有get方法
	private String currentTaskName;

	//最后一个任务
	private TaskInfo lastTaskInfo;
    //任务的总数,只有get方法
	private int taskCount;

	//所以任务的执行时间,只有get方法,getTotalTimeSeconds,getTotalTimeMillis,getTotalTimeNanos
	private long totalTimeNanos;

	public StopWatch() {
     
		this("");
	}
	public StopWatch(String id) {
     
		this.id = 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("Can't start StopWatch: it's already running");
		}
		this.currentTaskName = taskName;
		this.startTimeNanos = System.nanoTime();
	}

	
	//结束一个任务
	public void stop() throws IllegalStateException {
     
		if (this.currentTaskName == null) {
     
			throw new IllegalStateException("Can't stop StopWatch: it's 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);
	}




	public long getLastTaskTimeNanos() throws IllegalStateException {
     
		if (this.lastTaskInfo == null) {
     
			throw new IllegalStateException("No tasks run: can't get last task interval");
		}
		return this.lastTaskInfo.getTimeNanos();
	}

	/**
	 * Get the time taken by the last task in milliseconds.
	 * @see #getLastTaskTimeNanos()
	 */
	public long getLastTaskTimeMillis() throws IllegalStateException {
     
		if (this.lastTaskInfo == null) {
     
			throw new IllegalStateException("No tasks run: can't get last task interval");
		}
		return this.lastTaskInfo.getTimeMillis();
	}


	public String getLastTaskName() throws IllegalStateException {
     
		if (this.lastTaskInfo == null) {
     
			throw new IllegalStateException("No tasks run: can't get last task name");
		}
		return this.lastTaskInfo.getTaskName();
	}


	public TaskInfo getLastTaskInfo() throws IllegalStateException {
     
		if (this.lastTaskInfo == null) {
     
			throw new IllegalStateException("No tasks run: can't get last task info");
		}
		return this.lastTaskInfo;
	}


	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 name\n");
			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();
	}

	@Override
	public 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 {
     
        //当前任务的名字,只有get方法
		private final String taskName;
        //当前任务的时间,只有get方法,getTimeSeconds,getTimeMillis,getTimeNanos
		private final long timeNanos;

		TaskInfo(String taskName, long timeNanos) {
     
			this.taskName = taskName;
			this.timeNanos = timeNanos;
		}
	}

}

二、案例

案例1

StopWatch stopWatch = new StopWatch("测试");
stopWatch.start("小明到公司的时间");
Thread.sleep(1000);
stopWatch.stop();
stopWatch.start("小明回家的时间");
Thread.sleep(2000);
stopWatch.stop();
System.out.println(stopWatch);
StopWatch '测试': running time = 3005269923 ns; [小明到公司的时间] took 1003355119 ns = 33%; [小明回家的时间] took 2001914804 ns = 67%

案例2

StopWatch stopWatch = new StopWatch("测试");
stopWatch.start("小明到公司的时间");
Thread.sleep(1000);
stopWatch.stop();
stopWatch.start("小明回家的时间");
Thread.sleep(2000);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
StopWatch '测试': running time = 3000699408 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
1000186978  033%  小明到公司的时间
2000512430  067%  小明回家的时间

你可能感兴趣的:(Spring-IOC)