Apache和Spring提供的StopWatch执行时间监视器 (2)

==getTime和getSplitTime有啥区别呢?==
为了说明问题,此处我们看看getNanoTime()和getSplitNanoTime()亦可:

public long getNanoTime() { if (this.runningState == State.STOPPED || this.runningState == State.SUSPENDED) { return this.stopTime - this.startTime; } else if (this.runningState == State.UNSTARTED) { return 0; } else if (this.runningState == State.RUNNING) { return System.nanoTime() - this.startTime; } throw new RuntimeException("Illegal running state has occurred."); } public long getSplitNanoTime() { if (this.splitState != SplitState.SPLIT) { throw new IllegalStateException("Stopwatch must be split to get the split time. "); } return this.stopTime - this.startTime; }

我们发现:

调用getSplit...相关方法前,必须先调用Split方法

spilit()方法源码如下:

public void split() { if (this.runningState != State.RUNNING) { throw new IllegalStateException("Stopwatch is not running. "); } this.stopTime = System.nanoTime(); this.splitState = SplitState.SPLIT; }

在调用split方法后,watch的状态改为了SPLIT。且,且,且stopTime 设置为了当前时间。因此此处我们的stopTime停止了,这个时候调用getSplitNanoTime(),返回的是start到split那时的时间差值。因此用此方法可以插入先停止stopTime()(有点插队的赶脚),最后再输出(先插好队,最后在输出)~

而getTime()就是拿当前的时间戳,减去startTime,一般不涉及到stopTime的值,因此splitTime处理计算时间显然更加的灵活,但是,一般我们使用getTime()就足够了

Spring的StopWatch

Spring提供的这个任务监视器,我还是蛮喜欢使用的,因为一个它能够帮我同事监控多个任务,使用起来也很方便。先看一个简单的使用案例:

注意:一个监视器能够记录多个任务的执行时间这个特点非常重要哦~
比如:我们可以记录多段代码耗时时间,然后一次性打印~

public static void main(String[] args) throws Exception { // 强烈每一个秒表都给一个id,这样查看日志起来能够更加的精确 // 至于Id 我觉得给UUID是可行的~ StopWatch sw = new StopWatch(UUID.randomUUID().toString()); sw.start("起床"); Thread.sleep(1000); System.out.println("当前任务名称:" + sw.currentTaskName()); sw.stop(); sw.start("洗漱"); Thread.sleep(2000); System.out.println("当前任务名称:" + sw.currentTaskName()); sw.stop(); sw.start("锁门"); Thread.sleep(500); System.out.println("当前任务名称:" + sw.currentTaskName()); sw.stop(); System.out.println(sw.prettyPrint()); // 这个方法打印在我们记录日志时是非常友好的 还有百分比的分析哦 System.out.println(sw.shortSummary()); System.out.println(sw.currentTaskName()); // stop后它的值为null // 最后一个任务的相关信息 System.out.println(sw.getLastTaskName()); System.out.println(sw.getLastTaskInfo()); // 任务总的耗时 如果你想获取到每个任务详情(包括它的任务名、耗时等等)可使用 System.out.println("所有任务总耗时:" + sw.getTotalTimeMillis()); System.out.println("任务总数:" + sw.getTaskCount()); System.out.println("所有任务详情:" + sw.getTaskInfo()); // 拿到所有的任务 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxzdg.html