使用细节
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()); // 拿到所有的任务 }
打印:
当前任务名称:起床 当前任务名称:洗漱 当前任务名称:锁门 StopWatch 'd6ba9412-d551-4ba7-8b0e-1b7ccb42855d': running time (millis) = 3504 ----------------------------------------- ms % Task name ----------------------------------------- 01001 029% 起床 02000 057% 洗漱 00503 014% 锁门 StopWatch 'd6ba9412-d551-4ba7-8b0e-1b7ccb42855d': running time (millis) = 3504 null 锁门 org.springframework.util.StopWatch$TaskInfo@2d554825 所有任务总耗时:3504 任务总数:3 所有任务详情:[Lorg.springframework.util.StopWatch$TaskInfo;@68837a77
我个人偏爱使用Spring提供的这个监视器,是因为它提供的prettyPrint()打印在日志里进行分析可以非常的直观,并且我觉得提供的多任务支持也更加实用一点,当然仅仅个人偏好而已~
最后
很多时候,写代码也是一种艺术,而借助这种实用工具我就觉得艺术感更强些。希望我们能有追求更加美好事物的心,这点对于接纳新知识特别重要。此处推荐这个监视器来代替之前的的使用,能让小伙伴们更加灵活的分析你的代码~