我在java中有2个方法(例如因子计算),我必须测试这两个方法以找出哪一个更快。我将该代码作为Recursion和for循环:
它们都在相同的Class数据中。
public long FakultaetRekursiv( int n){
if(n == 1){
return 1;
}
else{
return FakultaetRekursiv(n-1) * n;
}
}
public long Fakultaet( int n){
int x=1;
for(int i=1; i<=n; i++){
x= x*i;
}
return x;
}
我听说currentTimeMillis()可能会有所帮助,但我不知道该怎么做。 感谢。
答案 0 :(得分:8)
Micro-benchmarking is hard,使用正确的工具,例如Caliper。以下是一个适合您的示例:
import com.google.caliper.SimpleBenchmark;
public class Benchmark extends SimpleBenchmark {
@Param({"1", "10", "100"}) private int arg;
public void timeFakultaet(int reps) {
for (int i = 0; i < reps; ++i) {
Fakultaet(arg);
}
}
public void timeFakultaetRekursiv(int reps) {
for (int i = 0; i < reps; ++i) {
FakultaetRekursiv(arg);
}
}
}
该框架会多次运行巡视time*()
方法,而且它会注入不同的arg
值并单独标记它们。
答案 1 :(得分:3)
始终遵循基础知识!只需使用它来查找每个函数所花费的时间
long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();
long duration = endTime - startTime;
答案 2 :(得分:3)
long start = System.currentTimeMillis();
//你的代码在这里
System.out.println(System.currentTimeMillis() - start + "ms");
答案 3 :(得分:-1)
你也可以手工完成:
第一种方法可以用F(x) = F(x-1) * x
的递归关系来描述,它生成模式......
F(x) = F(x-1) * x
= F(x-2)*x*(x-1)
= F(x-3)*x*(x-1)*(x-2)
. . .
= k*n
是O(n)。
显然,第二种方法也可以用O(n)来描述,这意味着它们处于相同的上限。但在实施时序解决方案之前,这可以用作快速检查。