2015-08-28 30 views
2

我为我的应用程序写了一个小绘图仪。ArrayList中的更快项目<T>

该函数需要很多时间,还有另一种方法,在Canvas中绘制得更快吗?

String auggabe = "x+2"; 
      float xMitte = step * (count_w/2); //stepp is 100px, count_w is 20 
      float yMitte = step * (count_h/2); //count_h is 10 
      ArrayList<Float[]> yWerte = new ArrayList<>(); 
      for(float i = (count_w/2 * -1);i <= count_w/2; i = getF(i + 0.15f)) 
      { 
       Log.d("FC", Float.toString(i)); 
       String a = new math_compile(auggabe.replace("x", String.valueOf(i)), 0).getAufgabe();//is a class they give me the arithmetic problem value 
       float y = Float.parseFloat(a.replace(" ","")) ; 
       yWerte.add(new Float[]{i, y*-1}); 
      } 

这个代码是我的问题,它的NEET长为133项 绘制belowe有

for(int inde = 0; inde <= yWerte.size()-2; inde++) 
      { 
       Float[] xy = yWerte.get(inde); 
       Float[] xyII = yWerte.get(inde + 1); 
       canvas.drawLine((xy[0] * step) + xMitte, (xy[1] * step) + yMitte, (xyII[0] * step) + xMitte, (xyII[1] * step) + yMitte, fc); 
      } 

圆浮

private float getF(float y) 
{ 
    DecimalFormat df = new DecimalFormat("#.##"); 
    String twoDigitNum = df.format(y).replace(",","."); 
    Log.d("getF", twoDigitNum); 
    return Float.parseFloat(twoDigitNum); 
} 
+1

简介您的应用程序,并点具体的问题在你的代码 –

+1

问题SI不是ArrayList中,它的字符串解析和格式化。 – Natix

+0

此外,(联合国)拳击可以降低性能。使用'float []'而不是'Float' []。 – Natix

回答

0

不知道这个,但我认为在for循环之外定义下面的变量“会产生一些更好的性能,因为它们也会像133次那样产生...

String a; 
 
float y; 
 
float[] xy; 
 
float[] xyII;

+0

好吧,我尝试,等待 我有看这个网页:http://www.devahead.com/blog/2011/12/coding-for-performance-and-avoiding -garbage-collection-in-android/ 但是没有帮助 – Facebamm

+0

以及如何在一个项目我浮动[]? – Facebamm

1
  • 不做平局内部分配。将它们作为对象初始化的一部分,或者一旦知道在接收某些数据时将绘制什么内容。看起来像整个第一部分可以移动到您的绘图代码之外,并且只有在它改变时才重新计算。

  • 不要使用列表yWerte,你可以做一个完美的数组。这将避免拨打get()

  • 不要使用Float其中float会做得很好。正如其他人指出的,boxing and unboxing也表现出色。

  • 您甚至可以预先计算每个x,y坐标的位置,并避免draw方法中的附加算术运算。这意味着基本上移动绘图之外的所有东西,并预先使用线条的x,y坐标预先计算一个float[][]数组。

+0

好吧,起初我翻译,它可以需要一些时间好 – Facebamm

+0

有我的代码,当我完成后,我再次发布http://pastebin.com/cFg4YvCq – Facebamm

+0

O,我读了一点关于“拳击和拆箱”是不使用强制转换和当前数据类型?只有 – Facebamm

0

//你正在执行的第一个代码块关闭引出线,对不对?

我看到的一个优化是,每个xy使用完全相同的乘法和加法,因此您可以预先计算这些乘法和加法。另外,这里有什么其他人建议使用原始的float是一个非常好的主意。此外,使用List.toArray()获得原始float[][]阵列:

// off-draw 
yWerte.add(new float[]{i * step + xMitte, y * -1 * step + yMitte}); 
float[][] arrWerte = yWerte.toArray(); 

// draw 
float[] xy = arrWerte[inde]; 
float[] xyII = arrWerte[inde + 1]; 
canvas.drawLine((xy[0], xy[1], xyII[0], xyII[1], fc); 

现在,作为实施变量声明出来的周期 - 这是一个很好的事情,但实际上JIT会为你做的(大师,指正如果我错了),所以你在任何当代环境中都不会得到任何明显的速度跳跃(任何来自2的Android。2)

不过,可以肯定,也使你的代码看起来更铁杆的副作用,这里的意图是在非JIT环境中更快的循环的实现:

// avoid property lookups using local vars 
int werteLength = arrWerte.length - 2; 
float[][] localArrWerte = arrWerte; 

for(int inde = 0; inde <= werteLength; inde++) { 
    float[] xy = arrWerte[inde]; 
    float[] xyII = arrWerte[inde + 1]; 
    canvas.drawLine((xy[0], xy[1], xyII[0], xyII[1], fc); 
} 

PS看看android performance guide

+0

好吧,起初我翻译,它可以花一些时间 – Facebamm

+1

好吧我已经改变了想法,你可以看看那里,这样好吗? http://pastebin.com/mXDEDpqt – Facebamm

+0

@DanielBaumertHackerOnBoard没有队友,不要使用迭代器(foreach语法),如果没有JIT它会变慢。但重用的想法非常整齐。 –