我知道如何衡量方法执行和完成所需的时间。但是,如果我有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");
答案 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为你做的简化。)