我想在 [400][400] 数组中存储/访问和查找一些 int 和 double 值。 前面的代码执行起来很慢。我听说字节数组没有进步,我 需要 int 和 double 值。 为什么在android中需要这么长时间?这些是非常原始的数据类型。 我怎样才能有效地做到这一点?
public static double[][]mat_cost = new double[400][400];
ArrayList<Point> pixel = new ArrayList<Point>();
ArrayList<Double> pixelValue = new ArrayList<Double>();
int[][]mat_binaer = new int[400][400];
for(int w = 0;w<400;w++){//x
for(int h = 0;h<400;h++){//y
mat_cost[w][h] = 0;
if(mat_binaer[w][h]==0){
pixel.add(new Point(w,h));
pixelValue.add(startValue);
}
}
}
需要 44798 毫秒 = 44,798 秒。 我应该使用另一种数据结构,如 c 中的指针吗? 我如何在 java for android 中实现它?
最佳答案
正如评论中已经提到的那样,pixel
更有可能, pixelValue
, new Point(x,y)
和 Double.valueOf(double)
正在放慢速度。所有这些都对内存分配器和垃圾收集器造成大量负载。
-
new ArrayList<>()
分配一个容量为零的数组列表。每次超出该容量时,列表都是 expanded ,从容量 12 开始,然后每次加倍。以新的长度创建一个新的后备数组,复制所有项目,旧数组用于垃圾回收。我无法从代码中看出mat_binaer == 0
的频率,但对于 160000 项,我怀疑您可能正在查看大量 ArrayList 扩展。如果您对必须添加的项目数量有合理的猜测,请按该大小预分配 ArrayLists,例如new ArrayList<>(1600)
如果您期望 1600 件商品。 - 每次添加一个原语
double
到ArrayList<Double>
,它使用Double.valueOf()
包裹在一个对象中.这些包装中的每一个都在堆上分配一个对象。使用double[]
会比使用 ArrayList 更有效。 - 同样,每个
new Point(x,y)
导致对象分配。如果您需要 xy 坐标,但不具体为Point
对象,然后有两个int[]
相同长度的数组,一个用于 x,一个用于 y,内存效率更高。
这种内存分配的东西通常是慢代码的嫌疑犯,但在所有性能调优问题中,您应该尽可能多地尝试在更改东西之前进行测量,例如,使用 systrace
.
关于java - 查找/存储 2d 作为 int,double[400][400] array in android fast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963898/