如何在Java中计算方法的执行时间?

1018
  1. 如何获取方法的执行时间?
  2. 是否有一个Timer实用程序类来计算任务所需的时间等?

大多数在Google上搜索的结果都是关于调度线程和任务的定时器,这不是我想要的。


JAMon API是一个免费、简单、高性能、线程安全的Java API,允许开发人员轻松监控生产应用程序的性能和可扩展性。JAMon跟踪点击次数、执行时间(总计、平均值、最小值、最大值、标准偏差)等等。http://jamonapi.sourceforge.net/下载: http://sourceforge.net/project/showfiles.php?group_id=96550 - Mike Pone
2
你可能还想看看Apache Commons Lang StopWatch类。一个简单但实用的工具类。 - user101561
类似的问题:如何在Java中编写正确的微基准测试? - Basil Bourque
是的,StopWatch非常适合这个。 - Shubham Pandey
Java 8使用Instant类:https://dev59.com/InVC5IYBdhLWcg3wz0h9#30975902 - akhil_mittal
42个回答

0

这里有许多有效的答案,所有这些答案都是在方法中实现的。为了制作一个通用的计时方法,我通常拥有一个名为Timing的类,该类包含以下内容。

public record TimedResult<T>(T result, Duration duration) {}

public static Duration time(Runnable r) {
    var s = Instant.now();
    r.run();
    var dur = Duration.between(s, Instant.now());
    return dur;
}

public static <T> TimedResult<T> time(Callable<T> r) throws Exception {
    var s = Instant.now();
    T res = r.call();
    var dur = Duration.between(s, Instant.now());
    return new TimedResult<>(res, dur);
}

这足够通用,可以通过可运行对象可调用对象

Duration result = Timing.time(() -> {
    // do some work.
});

TimedResult<String> result = Timing.time(() -> {
    // do some work.
    return "answer";
});

Duration timeTaken = result.duration();
String answer = result.result();

-1

纯Java SE代码,无需添加依赖项,使用TimeTracedExecuter

public static void main(String[] args) {

    Integer square = new TimeTracedExecutor<>(Main::calculateSquare)
                .executeWithInput("calculate square of num",5,logger);

}
public static int calculateSquare(int num){
    return num*num;
}

将会产生如下结果:

信息:计算数字的平方花费了3毫秒

自定义可重用类:TimeTracedExecutor

import java.text.NumberFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.function.Function;
import java.util.logging.Logger;

public class TimeTracedExecutor<T,R> {
    Function<T,R> methodToExecute;

    public TimeTracedExecutor(Function<T, R> methodToExecute) {
        this.methodToExecute = methodToExecute;
    }

    public R executeWithInput(String taskDescription, T t, Logger logger){
        Instant start = Instant.now();
        R r= methodToExecute.apply(t);
        Instant finish = Instant.now();
        String format = "It took %s milliseconds to "+taskDescription;
        String elapsedTime = NumberFormat.getNumberInstance().format(Duration.between(start, finish).toMillis());
        logger.info(String.format(format, elapsedTime));
        return r;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接