js css htmljava

Java计算程序代码耗时、计算程序运行的毫秒数的几种方式,几个S

2022-07-31  本文已影响0人  王月亮17

写代码的时候我们经常需要用到计时操作,来检测一段代码的性能,以便于做一些优化。本文主要说明计时的集中方式,可以根据自己的情况进行选择。

第一种也是最常用最简单的,使用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()即可。

上一篇下一篇

猜你喜欢

热点阅读