4

我在 java 中有 2 种方法(例如阶乘计算),我必须测试这两种方法以找出哪一种更快。我将该代码作为递归和 for 循环:

他们都在同一个类数据中。

    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() 会有所帮助,但我不知道该怎么做。谢谢。

4

4 回答 4

8

微基准测试很难,使用正确的工具,例如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值并分别对它们进行基准测试。

于 2013-01-24T19:52:57.880 回答
3

始终遵循基本原则!只需使用它来查找每个功能所花费的时间

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = endTime - startTime;
于 2013-01-24T19:52:04.180 回答
3
long start = System.currentTimeMillis();

// 你的代码在这里

System.out.println(System.currentTimeMillis() - start + "ms");
于 2013-01-24T19:52:12.817 回答
-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) 来描述,这意味着它们在相同的上界。但这可以用作实施时序解决方案之前的快速检查。

于 2013-01-24T20:02:10.790 回答