使用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 倍)。这两种方法几乎相同,只是一种在其中初始化了一个数组,而另一种将初始化的数组作为输入。这如何或为什么会导致时间显着增加?另一方面,对于相当小的数组(<500),我没有注意到任何值得注意的差异。所以,在我看来,只有更大的数组会受此影响。这是否可以更好地在方法外部初始化数组并将其作为方法的输入而不是在内部声明它?其他语言也一样吗?有什么更好的方法还是取决于情况?多谢!