2

いくつかの異なる方法(バイナリ検索、ネストされたループなど)を使用して、2つの配列間で共通の要素を見つける平均の実行時間を測定しています。ただし、ループする時間数を増やすと(実行時間を最後にループの数で割る)、反復ごとの平均実行時間は減少します。つまり、大幅に高速になります。

これを引き起こすメインメソッドの行を発見したので、メインの残りの部分は投稿しません。

int intersection=studentList.intersectionSizeNestedLoops(firstList1,secondList1);

最後の平均だけでなく、各反復の実行時間を調べたところ、その理由が正確にわかりました。何らかの理由で、最初の数回の反復には常にはるかに長い時間がかかります(リストのサイズによって異なりますが、たとえば、最初の数回は500 000 nsであるのに対し、その後はすべて20000 nsであるため、反復回数が多い場合は平均して実行時間が短くなります。したがって、20000 nsの反復の多く)。

ただし、アルゴリズムのいずれかである方法はないため、studentlistメソッドである必要があります。

リストを生成します:

public studentList(int size, String course) {
int IDrange = 2*size;
studentID = new int[size];
boolean[] usedID = new boolean[IDrange];

for (int i = 0; i < IDrange; i++) 
        usedID[i] = false;

for (int i=0;i<size;i++) {
    int t;

    do {
        t = (int) (Math.random()*IDrange);
    } while (usedID[t]);

    usedID[t] = true;
    studentID[i] = t;
}

courseName = course;
numberOfStudents = size;
}

ありがとうございました。

4

1 に答える 1

8

これは完全に正常です。ジャストインタイムコンパイラがコードの一部を起動してコンパイルするため、プログラムは高速になります。

これは、JVMをで起動することで確認できます-XX:+PrintCompilation

Javaコードのタイミングは注意が必要です。Javaで正しいマイクロベンチマークを作成するにはどうすればよいですか?を参照してください。良い議論のために。

于 2013-01-25T22:59:34.303 に答える