3

以下のコードと結果では、「Traverse2」が「Traverse1」よりもはるかに高速であることがわかります。実際、同じ数の要素をトラバースするだけです。

1.この違いはどのようにして生じたのですか?

2.短いインターレーションの中に長いインターレーションを入れると、パフォーマンスが向上しますか?

public class TraverseTest {

    public static void main(String[] args)
    {
        int a[][] = new int[100][10];
        System.out.println(System.currentTimeMillis());

        //Traverse1
        for(int i = 0; i < 100; i++)
        {
            for(int j = 0; j < 10; j++)
                a[i][j] = 1;
        }

        System.out.println(System.currentTimeMillis());

        //Traverse2
        for(int i = 0; i < 10; i++)
        {
            for(int j = 0; j < 100; j++)
                a[j][i] = 2;
        }

        System.out.println(System.currentTimeMillis());
    }
}

結果:

1347116569345

1347116569360

1347116569360

に変更すると

System.out.println(System.nanoTime());

結果は次のようになります。

4888285195629

4888285846760

4888285914219

これは、より長いインターレーションを内部に配置すると、パフォーマンスが向上することを意味します。また、キャッシュヒット理論とは矛盾しているようです。

4

4 に答える 4

1

私の見解では、配列のサイズも結果に影響します。お気に入り:

public class TraverseTest {

    public static void main(String[] args)
    {
        int a[][] = new int[10000][2];
        System.out.println(System.currentTimeMillis());

        //Traverse1
        for(int i = 0; i < 10000; i++)
        {
            for(int j = 0; j < 2; j++)
                a[i][j] = 1;
        }

        System.out.println(System.currentTimeMillis());

        //Traverse2
        for(int i = 0; i < 2; i++)
        {
            for(int j = 0; j < 10000; j++)
                a[j][i] = 2;
        }

        System.out.println(System.currentTimeMillis());
    }
}

Traverse1では、反復を終了するかどうかを決定するために10000*3+1 = 30001回の比較が必要ですが、Traverse2 では2*10001+1 = 20003回の比較しか必要ありません。

Traverse1 は Traverse2 の比較回数の 1.5 倍必要です。

于 2012-09-08T16:56:18.173 に答える