measureText的性能问题

时间:2015-08-26 04:10:25

标签: android performance

我在某些代码中遇到了性能问题:

for (int i = 0; i < list.size(); i++){        \\ size ~ 30k
    String str = list.get(i);
    float strWidth = paint.measureText (str);
}

我的Android应用程序在Genymotion模拟器中冻结了5秒,但是当我这样做时:

for (int i = 0; i < list.size(); i++){        \\ size ~ 30k
    String str = list.get(i);

    str = "a very very very long string";
    float strWidth = paint.measureText (str);
}

我根本没有任何性能问题。怎么解释这个?请帮忙。 在绘画中我使用自定义字体。

我尝试过多线程处理。我为列表创建了10个,100个线程,每个线程处理了列表的某些部分。但我总是得到相同的结果(5秒或更长时间)。我使用了AsyncTask。

2 个答案:

答案 0 :(得分:0)

尝试另一种提高效果的方法,

String str;
float strWidth;
int size = list.size();
for (int i = 0; i < size; i++){        
    str = list.get(i);
    strWidth = paint.measureText (str);
}

每次在for循环中访问list.size()都不是一个好习惯。

答案 1 :(得分:0)

在后一种情况下,字符串不会更改,因此结果会缓存到某处并且不会重新评估。

如果paint.measureText不便宜,您只能测量包含大量字母的字符串。如果你可以忍受不精确结果的可能性,你可以轻松地加速10x-100x。

我会

  1. 查找最长的字符串(根据字母数)
  2. 仅测量字母数至少为最长
  3. 的70%的字符串