写代码的时候我们经常需要用到计时操作,来检测一段代码的性能,以便于做一些优化。本文主要说明计时的集中方式,可以根据自己的情况进行选择。
第一种也是最常用最简单的,使用System.currentTimemillis()
long startMillis = System.currentTimeMillis();
Thread.sleep(1000L);
long endMillis = System.currentTimeMillis();
System.out.println(endMillis - startMillis);
简单粗暴地计算出程序消耗的毫秒数。
如果对精确度要求较高需要使用纳秒,那么可以使用System.nanoTime()
代替System.currentTimemillis()
,使用方式是一样的。
第二种是使用StopWatch
StopWatch有很多种,我们就一种一种来说吧。
先说Spring框架自带的StopWatch
最简单的使用方式:
StopWatch stopWatch = new StopWatch("程序计时");
stopWatch.start();
Thread.sleep(1000L);
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis());
如果希望得到纳秒,可以把stopWatch.getTotalTimeMillis()
改为stopWatch.getTotalTimeNanos()
。
稍微复杂点的用法,可以把一个大的任务分为几个小段分别计算:
StopWatch stopWatch = new StopWatch("程序计时");
stopWatch.start("第一段");
Thread.sleep(1000L);
stopWatch.stop();
stopWatch.start("第二段");
Thread.sleep(2000L);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
打印结果如下,只能打印纳秒:
StopWatch '程序计时': running time = 3003282700 ns
---------------------------------------------
ns % Task name
---------------------------------------------
1000665300 033% 第一段
2002617400 067% 第二段
再来看看apache的StopWatch
StopWatch stopWatch = new StopWatch("程序计时");
stopWatch.start();
Thread.sleep(1000L);
stopWatch.stop();
System.out.println(stopWatch.getTime());
apache的StopWatch是也可以分段,但是分段的形式与Spring的StopWatch不太一样:
StopWatch stopWatch = new StopWatch("程序计时");
stopWatch.start();
Thread.sleep(1000L);
stopWatch.split();
System.out.println(stopWatch.getSplitTime());
Thread.sleep(2000L);
stopWatch.stop();
System.out.println(stopWatch.getSplitTime());
两次都会打印时间,但是后面打印的时间会包含前面的时间,而不是分开计算,输出结果如下:
1001
3007
如果希望得到纳秒,可以使用stopWatch.getNanoTime()
和stopWatch.getSplitNanoTime()
。
还有谷歌的StopWatch
Stopwatch started = Stopwatch.createStarted();
Thread.sleep(1000L);
long seconds = started.stop().elapsed().getSeconds();
System.out.println(seconds);
创建不能通过new的方式,要调用createStarted()
方法来创建。getSeconds()
获取的是秒,如果要获取纳秒,使用getNano()
即可。
网友评论