3

この質問を見てください:

コード:

class test
{
    public static void main(String abc[])
    {
        for( int k=1; k<=3; k++)
        {
            for( int N=1; N<=1_000_000_000; N=N*10)
            {
                long t1 = System.nanoTime();

                int j=1;
                for(int i=0; i<=N; i++)
                    j=j*i;

                long t2 = System.nanoTime() - t1;
                System.out.println("Time taken for "+ N + " : "+ t2);
            }
        }
    }
}

上記のコードの出力:

Time taken for 1 : 2160
Time taken for 10 : 1142
Time taken for 100 : 2651
Time taken for 1000 : 19453
Time taken for 10000 : 407754
Time taken for 100000 : 4648124
Time taken for 1000000 : 12859417
Time taken for 10000000 : 13706643
Time taken for 100000000 : 136928177
Time taken for 1000000000 : 1368847843
Time taken for 1 : 264
Time taken for 10 : 233
Time taken for 100 : 332
Time taken for 1000 : 1562
Time taken for 10000 : 17341
Time taken for 100000 : 136869
Time taken for 1000000 : 1366934
Time taken for 10000000 : 13689017
Time taken for 100000000 : 136887869
Time taken for 1000000000 : 1368178175
Time taken for 1 : 231
Time taken for 10 : 242
Time taken for 100 : 328
Time taken for 1000 : 1551
Time taken for 10000 : 13854
Time taken for 100000 : 136850
Time taken for 1000000 : 1366919
Time taken for 10000000 : 13692465
Time taken for 100000000 : 136833634
Time taken for 1000000000 : 1368862705

ループでは、i の値が 0 から始まり、積がゼロであることを示しますが、JIT 最適化は行われません。なぜだめですか ?上記のリンクでは、以前に JIT が最適化していたメソッド呼び出しに for ループを入れていました。最適化プロセスを促進するメソッドにステートメントを入れていますか?

4

2 に答える 2

5
  1. 以前の質問では、JIT は、startメソッドが返されたときにたまたま変数に存在していた番号について分析せずに、メソッドの完全なコードを最適化しました。これは、メソッドを作成することを選択したためvoidであり、計算された値が破棄されるという簡単な手がかりを JIT に与えます。

  2. 現在の例と前の質問の例を比較すると、void呼び出されるメソッドがないため、当然最適化は行われません。この完全に異なるケースに役立つ他の最適化がない理由は、答えられない質問です。特定の JVM 実装、およびコードをテストした特定の JVM 呼び出しには、そのような最適化はありません。

于 2013-07-20T11:46:33.253 に答える
2

ループ自体はジッティングされますが (2 回目と 3 回目の実行でわずかに短い実行時間で観察されるように)、ループ全体を排除することは、メソッド自体が複数回実行された場合にのみ行われます。結果を伴わずに実際に除去できることを確認するための情報。

コードを変更すると、3 回目の呼び出しでループが解消されます。

public class LoopJit2 {

    public static void main(String abc[]) {
        for (int x = 0; x < 3; x++) {
            loopMethod();
        }
    }

    private static void loopMethod() {
        for (int N = 1; N <= 1_000_000_000; N = N * 10) {
            long t1 = System.nanoTime();

            int j = 1;
            for (int i = 0; i <= N; i++)
                j = j * i;

            long t2 = System.nanoTime() - t1;
            System.out.println("Time taken for " + N + " : " + t2);
        }
    }
}

時系列:

Time taken for 1 : 1466
Time taken for 10 : 1467
Time taken for 100 : 2934
Time taken for 1000 : 20044
Time taken for 10000 : 201422
Time taken for 100000 : 1993200
Time taken for 1000000 : 4038223
Time taken for 10000000 : 11182357
Time taken for 100000000 : 111290192
Time taken for 1000000000 : 1038002176
Time taken for 1 : 1466
Time taken for 10 : 1467
Time taken for 100 : 2934
Time taken for 1000 : 20044
Time taken for 10000 : 10755
Time taken for 100000 : 124667
Time taken for 1000000 : 1010045
Time taken for 10000000 : 10201156
Time taken for 100000000 : 103184413
Time taken for 1000000000 : 1019723107
Time taken for 1 : 978
Time taken for 10 : 1467
Time taken for 100 : 1467
Time taken for 1000 : 1955
Time taken for 10000 : 978
Time taken for 100000 : 489
Time taken for 1000000 : 977
Time taken for 10000000 : 977
Time taken for 100000000 : 978
Time taken for 1000000000 : 978
于 2013-07-20T11:48:33.463 に答える