5

配列を反復処理する単純な以下のプログラムがあります

Integer [] intArray = new Integer[20000];
    int index=0;
    for(int i=10000; i>=0; i--){
        intArray[index]=i;
        index++;
    }

    long startTime = System.currentTimeMillis();
    for(Integer t : intArray){

        System.out.println(t);
    }
    long endTime = System.currentTimeMillis();
    long consumedTime = endTime-startTime;
    System.out.println("Consumed time "+ consumedTime);

743、790、738、825、678 のように、消費時間の値は常に異なります。

for ループにかかる時間は、実行ごとに常に異なるのはなぜですか。

このコードを main メソッド内で実行していることに注意してください。私のOSはUbuntuで、プロセッサは32ビットです。

4

5 に答える 5

4

マシン上で実行されているのはプログラムだけではないからです。OS 自体、他のすべてのアプリなども CPU 時間を消費しますが、常に同じ量であるとは限りません。

于 2013-05-27T17:16:59.467 に答える
2

Javaプログラムにかかる時間は特にありません。マシン上で何が実行されているかによって異なります。また、使用しIntegerているため、より多くの時間がかかります。ネイティブの違いだけであれば、おそらく少なくなります。

于 2013-05-27T17:23:13.920 に答える
1

これは、Java プログラムを実行しているときに、オペレーティング システムがタスクを切り替えて膨大な数の操作を同時に実行するためです。プログラムを実行するまでに OS が多くの処理を行っていない場合、プログラムは高速になる可能性があります。また、OS がビジー状態の場合は遅くなる可能性があります。

つまり、オペレーティング システムは、プログラムが実行されるたびに異なる一連の同時タスクを実行しているため、実行時間が異なります。

于 2013-05-27T17:21:32.393 に答える
0

Java プログラムのプロファイリングを確実に行うことは、簡単なことではありません。他の回答ですでに指摘されている、マシン上の他のプロセスが原因で発生する変動に加えて、ジャストインタイムコンパイラがある場合、ガベージコレクションと仮想マシンの興味深い効果による非決定性も発生します。

あなたの例では、ガベージ コレクションは実際には問題ではありませんが、JIT コンパイルにより、最初の数回のループ反復が次の数千回よりも大幅に遅くなる可能性があります。したがって、合計時間を反復回数で除算して、反復あたりの平均時間を適切に概算することは誤りです。

この影響を回避するには、測定を開始する前にループ本体を何度も「実行」する必要があります。

于 2013-05-27T20:12:11.477 に答える
0

Java は実行時間について約束をしないためです。最新の OS では、一度に多くのことが行われています。

時間は同じではありませんが、あまり変化は見られません。

于 2013-05-27T17:18:42.077 に答える