我知道如何测量方法执行和完成所需的时间。但是,如果我有 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");
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
一个好的解决方案,虽然可能很难设置,是使用面向方面的编程并应用一些@Around
(AspectJ注释)建议,将目标方法的执行与时间计算包装在一起。Spring 提供了一个简单的 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为您所做的简化。