在循环中添加赋值,但在JAVA中额外花费50%的时间

在循环中添加赋值,但在JAVA中额外花费50%的时间,java,loops,Java,Loops,我有一个这样的循环(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]); 我想知道ED[

我有一个这样的循环(
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]);

我想知道
ED[I][j]
是否大于5000,所以做一个简单的比较。但新版本代码的运行成本约为8秒。我认为花这么多时间是不可能的。但我尝试了很多方法,却没有找到问题所在。我希望有人能帮助我。非常感谢你。这里的代码不完整,但我保证我什么都不做,只添加一个简单的句子。即使我添加了
bool[I][j]=true
ED[i][j]=dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j]=ED[i][j]>5000;

这将重复近2000×200×200=8000000次!在如此多的迭代中,即使是简单的数组检查或布尔赋值也会花费大量时间。

在这两个版本中都没有使用
k
,请删除外部循环,您的性能应该会提高。
q,n,m
有多大?此外,如果我们能够重现该问题,我们可以更好地帮助您。请尝试发布一个q接近20000,n和m接近200为什么在
k
上有一个循环?您正在进行200*200*20000=80000000的2D数组访问、整数比较和布尔存储到内存。这不可能是免费的。但如果我只是重复一个简单的8000000次循环(qx,qy,dx,xy,但用k改变),新的布尔赋值值几乎为0。只有在我的源代码中才会出现问题。@Mark.zxx好吧,这不是简单的赋值。每次引用两个不同的数组。然后将值指定给另一个二维数组。简单的布尔赋值很便宜,但这里使用的是2D数组,每次循环迭代时都需要对其进行检查。
ED[i][j]=dis(qx[i], qy[i], dx[j], dy[j]);
bool[i][j]=ED[i][j]>5000;