4

Javaには2つのメソッド(階乗計算など)があり、これら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) です。

明らかに、2 番目の方法も O(n) で記述できます。これは、それらが同じ上限にあることを意味します。ただし、これは、タイミング ソリューションを実装する前のクイック チェックとして使用できます。

于 2013-01-24T20:02:10.790 に答える