4

私はJavaの初心者です。以下のコーディングを行いました。

class TimeComplex{
    public static void main(String []args){
        long startTime, stopTime, elapsedTime;

        //first call
        startTime = System.currentTimeMillis();
        System.out.println("\nstart time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t1st loop execution time : " + elapsedTime+ "\n");

        //second call
        startTime = System.currentTimeMillis();
        System.out.println("start time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t2nd loop execution time : " + elapsedTime + "\n");

        //third call
        startTime = System.currentTimeMillis();
        System.out.println("start time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t3rd loop execution time : " + elapsedTime + "\n");
    }

    static void calcForLoop(){
        for(long i = 12_85_47_75_807L; i > 0; i--);
    }
}

コードは、プログラムの実行時間を増やすためだけに for ループを長時間実行します。が初めて呼び出されたときcalcForLoop()、プログラムの実行時間は、同じメソッドが 2 回目に呼び出されたときに最大になります。プログラムにかかる時間は、最初の呼び出しよりも短く、メソッドへの 3 回目の呼び出しcalcForLoop()は 2 回目よりも短いか同じです。実行時間。このプログラムを 5 ~ 6 回実行しましたが、実行時間は同じパターンでした。これは私のプログラムの出力です。

私の質問は、実行するコードが3回すべて同じままであるのに、なぜこれが起こるのかということです。コンパイラによって行われるコードの最適化はありますか、それともオペレーティング システム環境に依存していますか。この場合のように、同じコード ブロックを繰り返し実行する場合、コンパイラはどのような最適化を行いますか?

4

3 に答える 3

2

JIT (ジャスト イン タイム) コンパイラは、多くの実行が行われていることを JVM が検出したコードをコンパイルします。これにより、パフォーマンスが向上します。このようなコンパイルが行われている間、実際にはパフォーマンスが一時的に低下することがあります。

通常、パフォーマンス テストではこの影響を考慮に入れます。コードを数千回実行してから、ベンチマークを開始します。

于 2013-07-07T09:31:55.947 に答える
0

経過時間をより正確に測定したい場合は、System.currentTimeMillis()を使用する代わりにSystem.nanoTime()を使用する必要があります。

もちろん、Bohemian が JIT do について言及したことも明らかになります。

于 2013-07-07T09:48:12.240 に答える
0

ループ ネスト最適化は、局所性の最適化または並列化を目的として一連のループ変換を適用する最適化手法です。古典的な使用法の 1 つは、一部の一般的な線形代数アルゴリズムでキャッシュを再利用するために必要なメモリ アクセス レイテンシまたはキャッシュ帯域幅を削減することです。

于 2013-07-07T09:39:57.680 に答える