业务代码或者算法的性能一直是我们重要的关注点之一。而衡量性能的重要指标之一就是时间复杂度。我们除了用大O表示法外,有时还需要直观地通过程序的实际运行时间衡量算法的性能。今天我们就介绍一下在计时方面十分重要的工具类StopWatch。
StopWatch是不在java标准包中的,你可以在以下两个程序包中找到StopWatch工具类:
Apache Commons Lang中的StopWatch与我们平时常用的秒表的行为比较类似,我们先看一下其中的一些重要方法:
示例代码:
import org.apache.commons.lang3.time.StopWatch; import org.junit.Test; import java.util.concurrent.TimeUnit; public class StopWatchTest { @Test public void testStopWatch() throws InterruptedException { StopWatch stopWatch = new StopWatch(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.start(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.stop(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.reset(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.start(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.split(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.split(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.unsplit(); sleepOneSecondAndGetStopWatchReading(stopWatch); stopWatch.split(); System.out.println("Last Split time :"+stopWatch.getSplitTime()+" ms"); System.out.println(stopWatch.toSplitString()); System.out.println(stopWatch.toString()); } private void sleepOneSecondAndGetStopWatchReading(StopWatch stopWatch) throws InterruptedException { Thread.sleep(1000); System.out.println("StopWatch Time: "+stopWatch.getTime(TimeUnit.MILLISECONDS)+"ms"); } }
相比于Apache Commons Lang中的StopWatch,Spring Framework中的StopWatch提供了额外的任务计时功能:不仅可以统计单个任务时间,还可以优雅地打印出多个任务的详细耗时情况。
我们先看一下StopWatch类的构造器和一些关键方法:
示例代码:
public static void main(String[] args) { StopWatch stopWatch = new StopWatch(); for (int i=0;i<10;i++){ stopWatch.start("Task"+i); //Some Real Business Logic stopWatch.stop(); } stopWatch.prettyPrint(); }
代码中启动并在真正的业务逻辑完成后分别停止了十个任务的计时,最终我们可以通过prettyPrint方法来获得详细的任务执行耗时情况。