Commons-lang3提供的StopWatch执行时间监视器, spring也提供了一样功能的工具java
前言
咱们若是要统计一段代码的执行时间:咱们的办法是spring
public static void main(String[] args) { long startTime=System.currentTimeMillis(); //获取开始时间 //函数主体代码 //... long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); }
假若咱们要展现成秒、甚至分钟,还得咱们本身处理
可能到了JDK8之后,咱们变得稍微优雅一些了 能够这么处理:框架
Instant start = Instant.now(); //doSomething(); Instant end = Instant.now(); Duration duration = Duration.between(start, end); System.out.println("millis = " + duration.toMillis());
这个比上面优雅一点,灵活度也更强一些。但定义的变量有点多,整体上仍是不够优雅。所以本文介绍StopWatch执行时间监视器,来统计咱们程序的执行时间,很是多的方便和优雅。函数
StopWatch:执行时间监视器
StopWatch有不少开源的框架都有提供相似的功能。好比Apache的commons-lang3,还有Spring framwork本身都有提供。工具
但本文只介绍lang3里面的,功能上大同小异。并且Apache提供的功能强大,而且lang3包通常是咱们必导的包,但spring的就不必定了(好比纯java项目,是不用导入spring包的),lang3的功用性也更强些。this
public static void main(String[] args) throws Exception { StopWatch watch = StopWatch.createStarted(); //建立后当即start,经常使用 //StopWatch watch = new StopWatch(); //watch.start(); Thread.sleep(1000); System.out.println("统计从开始到如今运行时间:" + watch.getTime() + "ms"); //1000ms Thread.sleep(1000); watch.split(); System.out.println("从start到此刻为止的时间:" + watch.getTime()); System.out.println("从开始到第一个切入点运行时间:" + watch.getSplitTime()); //2245 Thread.sleep(1000); watch.split(); System.out.println("从开始到第二个切入点运行时间:" + watch.getSplitTime()); watch.reset(); //重置后必须使用start方法 watch.start(); Thread.sleep(1000); System.out.println("从新开始后到当前运行时间是:" + watch.getTime()); //1000 watch.suspend(); //暂停 Thread.sleep(6000); //模拟暂停6秒钟 watch.resume(); //上面suspend,这里要想从新统计,须要恢复一下 System.out.println("恢复后执行的时间是:" + watch.getTime()); //1000 注意此时这个值仍是1000 watch.stop(); System.out.println("花费的时间》》" + watch.getTime() + "ms"); //1002ms System.out.println("花费的时间》》" + watch.getTime(TimeUnit.SECONDS) + "s"); //1s 能够直接转成s }
如上就是StopWatch的基本使用方法。spa
getTime和getSplitTime有啥区别呢?
此处咱们看看getNanoTime()和getSplitNanoTime()便可pwa
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; }
咱们发现:code
spilit()方法源码以下:get
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,用stopTime减去startTime便可。所以用此方法能够插入先中止stopTime,最后再输出。
而getTime()就是拿当前的时间戳,减去startTime,通常不涉及到stopTime的值,所以splitTime处理计算时间显然更加的灵活,可是,通常咱们使用getTime()就足够了
最后 不少时候,写代码也是一种艺术。但愿咱们能有追求更加美好事物的心,这点对于接纳新知识特别重要。所以此处推荐这个监视器来代替以前的的使用,能让咱们更加灵活的控制程序代码。