欢迎光临
我们一直在努力

Java:计算代码耗时的5种方法

在java开发过程中,常常会用一些方法来计算一段代码的耗时,那么java中计算耗时的方法有哪些,这里整理总结如下:

1、使用System.currentTimeMillis()函数

例如:我们如果要统计一段代码的执行时间,经常会这么来写:

public static void main(String[] args) {
    long startTime = System.currentTimeMillis();   //获取开始时间

    //函数主体代码
    //...

    long endTime = System.currentTimeMillis(); //获取结束时间
    System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
}
2、使用System.nanoTime()函数

代码如下:

long start = System.nanoTime();
// some code

long finish = System.nanoTime();
long timeElapsed = finish - start;
3、在java8中使用Instant.now()函数

代码如下:

public static void main(String[] args) {
    Instant start = Instant.now();
    //doSomething();
    Instant end = Instant.now();

    Duration duration = Duration.between(start, end);
    System.out.println("millis = " + duration.toMillis());
}
4、使用apache.commons提供的StopWatch

首先,在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

Apache提供的这个任务执行监视器功能丰富强大(比Spring的强大),灵活性强,如下经典实用案例:

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

}

打印结果:

统计从开始到现在运行时间:1007ms
从start到此刻为止的时间:2008
从开始到第一个切入点运行时间:2008
从开始到第二个切入点运行时间:3009
重新开始后到当前运行时间是:1000
恢复后执行的时间是:1000
花费的时间》》1001ms
花费的时间》》1s
5、使用Spring 框架提供的StopWatch

Spring提供的这个任务监视器,它能够同时监控多个任务,使用起来也很方便。

代码如下:

import org.springframework.util.StopWatch;


StopWatch watch = new StopWatch();
watch.start("watcher");
//some code
watch.stop();

System.out.println(watch.prettyPrint());

案例:

注意:一个监视器能够记录多个任务的执行时间这个特点非常重要哦~
比如:我们可以记录多段代码耗时时间,然后一次性打印~

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()打印在日志里进行分析可以非常的直观,并且我觉得提供的多任务支持也更加实用一点,当然仅仅个人偏好而已~

赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » Java:计算代码耗时的5种方法

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址