2

次のコードを使用して、いくつかの並べ替えアルゴリズムの実行時間をテストしたい

int n = 2000;
for(int i=0; i<10; i++){
    n *= 2;
    init(array, n); // initializes array with n elements
    long startTime = System.nanoTime();
    sort(array;
    long elapsedTime = System.nanoTime()-startTime;
    System.out.println("Size: "+n+"\t\tTime: "+elapsedTime/1000000+"(ms)");         
}

出力は

Size: 4000      Time: 0(ms)
Size: 8000      Time: 0(ms)
Size: 16000     Time: 0(ms)
Size: 32000     Time: 0(ms)
Size: 64000     Time: 0(ms)
Size: 128000    Time: 0(ms)
Size: 256000    Time: 0(ms)
Size: 512000    Time: 0(ms)
Size: 1024000   Time: 0(ms)
Size: 2048000   Time: 0(ms)

問題はアルゴリズムにあるのではなく、配列を適切にソートし、大きな配列のジョブを実行するにはかなりの時間がかかります。この例の実行には約 10 秒かかりました。Javaのドキュメントで説明されているように、nanoTime()を使用したと思います。この問題の答えを検索したところ、同様の問題が発生したようです。たとえば、 Java にストップウォッチはありますか? . しかし、問題を解決する方法を見つけることができませんでした。apache の StopWatch を使用する提案がありましたが、私が理解したところでは、nanoTime() への同様の呼び出しを使用します。では、この問題を解決するにはどうすればよいでしょうか。違いがある場合は、jre 1.8.0_31 を使用して Windows 7 でコードを実行しています。ありがとう

4

2 に答える 2

4

整数除算を使用してナノ秒をミリ秒に変換しているため、すべて同じ数値が表示されます。これにより、除算して小数点以下を切り捨てる効果があります。

変更してみてください:

elapsedTime/1000000

に:

elapsedTime/1000000d

小数点以下の桁数を含む結果を取得して、小数ミリ秒を取得します。

sort の呼び出しを a に置き換えることで、ループのタイミングを確認することもできますThread.sleep(50);。ループのすべての反復に 50 ミリ秒を少し超える時間がかかることがわかります。

于 2015-06-02T04:15:38.497 に答える
1

答えは単純に、並べ替えアルゴリズムがそれぞれのケースで 1 ミリ秒よりも速く実行され、私の整数除算がそれをゼロに丸めたということのようです。私はそのばかげたことをお詫び申し上げます:)

更新されたコード

int n = 2000;
for(int i=0; i<10; i++){
    n *= 2;
    int maxN = 500;
    init(array, n, maxN);
    long startTime = System.nanoTime();
    sort(array, 0, array.length-1); 
    long endTime = System.nanoTime();
    int elapsedTime = (int) (endTime-startTime);
    System.out.println("Size: "+n+"\t\tTime: "+elapsedTime+"(ns)"+
                "\t\tStart Time: "+startTime+
                "\t\tEnd Time: "+endTime);          
}

出力を示します

Size: 4000      Time: 15822(ns)     Start Time: 699563217433713     End Time: 699563217449535
Size: 8000      Time: 3849(ns)      Start Time: 699563218239780     End Time: 699563218243629
Size: 16000     Time: 4276(ns)      Start Time: 699563219213047     End Time: 699563219217323
Size: 32000     Time: 3421(ns)      Start Time: 699563220704592     End Time: 699563220708013
Size: 64000     Time: 9835(ns)      Start Time: 699563222929081     End Time: 699563222938916
Size: 128000        Time: 3849(ns)      Start Time: 699563227085137     End Time: 699563227088986
Size: 256000        Time: 3849(ns)      Start Time: 699563234049813     End Time: 699563234053662
Size: 512000        Time: 5987(ns)      Start Time: 699563247567366     End Time: 699563247573353
Size: 1024000       Time: 8980(ns)      Start Time: 699563274115410     End Time: 699563274124390
Size: 2048000       Time: 8125(ns)      Start Time: 699563326704767     End Time: 699563326712892
于 2015-06-02T04:21:19.537 に答える