1

新しいバブルソートプロジェクトを作成しましたが、どれくらいの時間がかかるか知りたいです。したがって、getTime()ナノタイムを返すメソッドを追加しました。また、9つの静的な値を持つ配列を作成しました。コードを実行すると、実行時間が異なります(つまり、通常は3849 nsですが、6432または4277 nsになることもあります)。どうすればいいの?

私のコードは次のとおりです。

long time2;
public void sort(int[] dizi){
    long time = System.nanoTime();
    for (int i = dizi.length-1; i >0; i--) {
        for (int j = 0; j < i; j++) {
            if(dizi[j]>dizi[j+1]){
                super.swap(dizi, j, j+1);
            }
        }
    }
    time2 = System.nanoTime() - time;
}
public long getTime(long time){
      return time;
}
main(){
      BubbleSort bubbleSort = new BubbleSort();
      int[] arr = {4,2,1,8,9,5,3,7,6};
      bubbleSort.sort(arr);
      Sysout(bubbleSort.getTime(time2));
}
4

2 に答える 2

0

実行しているハードウェアがナノ秒を正確に測定できない限り(ヒント-それはできません)、Javaがns単位で正確なタイムスタンプを提供する方法はありません。

その上、Javaはコードの実行時間に関して決定論的ではありません。いつでも、JVMが実行している他の多数のハウスキーピングタスク、特にガベージコレクションによってコードが中断される可能性があります。

ホットスポットコンパイラもあります。これは、非常に頻繁に実行されているバイトコードを識別し、その場でネイティブコードに再コンパイルします。これにより一時停止が発生しますが、その後の実行でパフォーマンスが向上します。方程式からホットスポット効果を削除する場合は、コードを数万回実行してコードをソークテストし、ネイティブコードにコンパイルされていることを確認してから、実際の時間指定実行を実行して確認する必要があります。コードの効率。

あなたが見てきたように、最終結果は、コードが複数回実行され、同じ結果を生成するが、その結果を返すのに異なる時間がかかることです。そして、どこのOCDコーダーにとっても悪いニュースは、番号を同じにすることは決してないということです。テストの実行ごとに。

このようなパフォーマンステストでは、通常、コードを1,000回実行し、特定のコードの実行時間を正確に把握するために、タイミングの最速時間、最遅時間、平均時間、および標準偏差を記録することを期待します。予期しない低速実行が発生した場合、VMで詳細なGCオプションが有効になっているときに、ログで完全なGCイベントを探します。

ああ、JVMが実行されているOSも可変量のランタイムを提供していることを忘れないでください。OSには、実行中のハウスキーピングタックもあります。

于 2013-03-18T00:34:11.433 に答える
0

結果に影響を与える可能性のある複数の要因があります。

JVMはガベージコレクションの実行を開始する場合がありますが(これは間違いなくあなたのケースではありません)、プログラムの実行中にJVMがメモリを割り当てる可能性があり、基盤となるOSサービスは、使用可能なRAMが不足しているなどの理由で、メモリをスワップする必要があることを検出します...

利用可能なJVM(Mac、Windows、Linux / Unix用)はいずれもリアルタイムシステムで実行されませんが、たとえ1日実行されたとしても、JVMは、一部のJVMアクティビティと比較してプログラムの優先度が低いと判断する場合があります。

より大きな配列を試してみてください。結果はより安定します。

于 2013-03-18T00:46:13.290 に答える