如何创建一种方法来衡量执行方法所需的时间

时间:2015-01-01 16:37:28

标签: java benchmarking microbenchmark

我知道如何衡量方法执行和完成所需的时间。但是,如果我有10种不同的方法,我想测量10种方法中每种方法运行的时间。对我来说,写System.currentTimeMillis()二十次是没有效率的。

所以我只是想知道是否有一个更有效的方法解决这个问题,即创建一个方法来测量特定方法运行所需的时间,并且该特定方法将作为参数传递(这是一个想法在我的头脑中,我可能完全错了)?

long startTime = System.currentTimeMillis();
// Create graph and read file
Graph dag = new Graph();
read_file(dag, "FILE.txt");
long endTime = System.currentTimeMillis();
System.out.println("Load file: " + (endTime - startTime) + " milliseconds");

// Transposing graph
startTime = System.currentTimeMillis();
Graph dag_rev = new Graph();
Graph dag_transposed = dag_rev.transposed(dag);
endTime = System.currentTimeMillis();
System.out.println("Transposing graph: " + (endTime - startTime) + " milliseconds");

2 个答案:

答案 0 :(得分:2)

AOP,使用注释。您只需要使用System.currentTimeMills(),但它确保您只需编写一次并根据需要多次使用它。 以下是Spring AOP的示例: http://www.mkyong.com/spring/spring-aop-examples-advice/ 没有春天: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

答案 1 :(得分:2)

一个好的解决方案,虽然可能很难设置,但是使用面向方面编程并应用一些@Around(AspectJ注释)建议,该建议用时间计算包装目标方法的执行。 Spring provides a simple implementation with AspectJ

另一种解决方案是提供类似

的方法
public static <T> T time(Callable<T> code) throws Exception { // possibly add a String message parameter to print out
    long startTime = System.currentTimeMillis();
    T value = code.call(); // or wrap unchecked exception
    long endTime = System.currentTimeMillis();
    System.out.println("Method executed: " + (endTime - startTime) + " milliseconds");
    return value;
}

然后将您要执行的代码(包括方法调用)作为Callable传递给此方法

Graph graph = time(() -> {
    Graph dag = new Graph();
    read_file(dag, "FILE.txt");
    return dag;
});

(这几乎是AOP为你做的简化。)