0

以下に示すように、2つのreadDataMethod()の速度パフォーマンス(存在する場合)を比較したいと思います。

private void readDataMethod1(List<Integer> numbers) {
    final long startTime = System.nanoTime();
    for (int i = 0; i < numbers.size(); i++) {
        numbers.get(i);
    }
    final long endTime = System.nanoTime();
    System.out.println("method 1 : " + (endTime - startTime));
}

private void readDataMethod2(List<Integer> numbers) {
    final long startTime = System.nanoTime();
    int i = numbers.size();
    while (i-- > 0) {
        numbers.get(i);
    }
    final long endTime = System.nanoTime();
    System.out.println("method 2 : " + (endTime - startTime));
}

ほとんどの場合、私が得た結果は、方法2の値が「低い」ことを示しています。

   Run         readDataMethod1    readDataMethod2

     1                  636331             468876
     2                  638256             479269
     3                  637485             515455
     4                  716786             420756

このテストは、readDataMethod2が以前のものよりも高速であることを証明していますか?

4

4 に答える 4

3

最初のものでは、反復ごとに numbers.size() を呼び出しています。変数に格納してみて、もう一度確認してください。

于 2012-05-23T14:39:11.733 に答える
3

このテストは、readDataMethod2 が以前のものよりも高速であることを証明していますか?

仮定を立てるのではなく、相対的なパフォーマンスを測定しているという点で、正しい方向に進んでいます。

ただし、Java でマイクロベンチマークを作成する際には、注意すべき潜在的な問題がたくさんあります。How do I write a correct micro-benchmark in Java?を読むことをお勧めします 。

于 2012-05-23T14:40:01.687 に答える
0

このテストは、 readDataMethod2 が以前のものよりも高速であることを証明していますか?

@aix が言うように、あなたは正しい軌道に乗っています。ただし、方法論にはいくつかの特定の問題があります。

  • JVM を「ウォームアップ」しているようには見えません。したがって、起動時の影響 (JIT コンパイル) によって数値が歪められたり、コードが JIT コンパイルされていないことが考えられます。

  • また、あなたの実行はほとんど仕事をしていないと主張します。500000ナノ秒は秒であり、それ0.0005はたいした作業ではありません。リスクは、アプリケーションの外部にある「その他のもの」が測定にノイズを導入する可能性があることです。数十秒かかるランの方が自信が持てます。

于 2012-05-23T15:22:34.927 に答える
0

2 番目のバージョンが高速に実行される理由は、各反復で numbers.size() を呼び出しているためです。数値に格納して置き換えると、最初のものとほぼ同じになります。

于 2012-05-23T14:53:27.753 に答える