2

Java を使用して数学の問題を解こうとし、解の効率を高める方法を探していたところ、実行時間が非常に大幅に増加しましたが、その原因はわかりませんでした。いくつかのテストの後、答えを見つけたかもしれませんが、これがどのように、またはなぜ起こるのかはまだわかりません.

この時間差を示すテスト コードは次のとおりです。

public class arrayAcessTime {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        AccessTime();
    }

    public static long getLargestPrimeFactor(long l, int[] x)
    {
        long p = 0, n = l/2, r = (long) Math.sqrt(l), y = 49;

        for(long i = 13; i <= r;)
        {
            for(int j = 0; j<x.length; j++)
            {
                if (l % i == 0) 
                {
                  n = l/i;
                } 

                else 
                {
                   n = l / (i + 1); 
                }

                i+=x[j];
            }
        }

        return p;
    }

    public static long getLargestPrimeFactor(long l)
    {
        long p = 0, n = l/2, r = (long) Math.sqrt(l), y = 49;

     int x[] = {2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2,         

      System.out.println("x size: " + x.length);

        for(long i = 13; i <= r;)
        {
            for(int j = 0; j<x.length; j++)
            {
                if (l % i == 0) 
                {
                  n = l/i;
                } 

                else 
                {
                   n = l / (i + 1); 
                }

                i+=x[j];
            }
        }

        return p;
    }

    public static void AccessTime() {

        int array2[] = {2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2,....} //too large to write here 


        long start;
        double diff;

        System.out.println("Array2 size: " + array2.length);

        start = System.currentTimeMillis();

        getLargestPrimeFactor(8798765600851475143L, array2);

        diff = (System.currentTimeMillis() - start) / 1000.0;

        System.out.println("Time: " + diff);


        start = System.currentTimeMillis();

        getLargestPrimeFactor(8798765600851475143L);

        diff = (System.currentTimeMillis() - start) / 1000.0;

        System.out.println("Time: " + diff);

    }
}

出力:

Array2 size: 5760
Time: 6.144
x size: 5760
Time: 30.225

ご覧のとおり、時間の増加は非常に顕著です (約 5 倍)。2 つのメソッドはほとんど同じですが、一方は内部で初期化された配列を持ち、もう一方は初期化された配列を入力として受け取る点が異なります。これにより、時間の大幅な増加がどのように、またはなぜ発生するのでしょうか? 一方、かなり小さい配列 (<500) では、注目すべき違いに気付きませんでした。したがって、これにより大きな配列のみが影響を受けるように思えます。これにより、配列をメソッド内で宣言する代わりに、メソッド外で初期化し、メソッドへの入力として取得する方がよいでしょうか? これは他の言語でも同じですか?より良いアプローチは何ですか、それとも状況によって異なりますか?どうもありがとう!

4

1 に答える 1