我在某些代码中遇到了性能问题:
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。
答案 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。
我会