java - 查找/存储 2d 作为 int,double[400][400] array in android fast

标签 java android arrays

我想在 [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 件商品。
  • 每次添加一个原语doubleArrayList<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/

相关文章:

Java ArrayList 中断删除

java - 以编程方式启用或禁用 TestNG 中的断言

android - Textview 消失但 listview 可见

javascript - 更有效的方法来完成这个?

javascript - 用一个元素初始化数组,如果数组存在则压入元素

php - 在多维数组中的 php 中排序时忽略重音字符

java - 返回 null 的构建器模式

java - 如何使用-Xlint :unchecked in a Maven project?进行编译

android - java.lang.NullPointerException : Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource (int)' on a null object reference 异常

android - YouTube Android SDK - 凭据无效