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

时间:2017-07-01 15:15:56

标签: java loops

我有一个这样的循环(q = 20000m = n = 200,实际上不同的k有不同的qxqydx数组,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

&#34; DIS&#34;是计算(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

1 个答案:

答案 0 :(得分:1)

由于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 = 800000000次!在如此多的迭代中,即使是简单的数组检查或布尔分配也会耗费大量时间。