我有一个这样的循环(q = 20000
,m = n = 200
,实际上不同的k
有不同的qx
,qy
,dx
,dy
数组。但我并没有在这里发布所有代码):
double[][] ED = new double[n][m];
for(int k = 0; k < q; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
ED[i][j] = dis(qx[i], qy[i], dx[j], dy[j]);
这个循环的开销大约是5s
。
"dis“是一个计算(x1,y1)
和(x2,y2)
之间距离的函数。请不要介意。问题是当我在循环中添加另一个赋值时,就像这样:
double[][] ED = new double[n][m];
boolean[][] bool = new boolean[n][m];
for(int k = 0; k < q; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
ED[i][j] = dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j] = ED[i][j] > 5000;
}
我想知道ED[i][j]
是否大于5000,所以做一个简单的比较。但新版本的代码运行成本约为8秒。我认为花费这么多时间是不可能的。但我尝试了很多方法,都找不到问题所在。我希望有人能帮助我。非常感谢。代码在这里是不完整的,但我保证我除了添加一个简单的句子什么也不做。即使我添加了一个bool[i][j] = true;
,它也需要额外的1.5s
。
发布于 2017-07-01 16:57:02
自k=2000 m=n=200以来,内部循环即
ED[i][j]=dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j]=ED[i][j]>5000;
这将被重复近2000×200×200 = 80000000次!在如此多的迭代中,即使是简单的数组检查或布尔赋值也会花费大量的时间。
https://stackoverflow.com/questions/44862468
复制