2015-08-26 2 views
0

У меня есть проблемы с производительностью в некоторый код:вопрос Производительность measureText

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

мой андроид приложение замораживании в течение 5 секунд в Genymotion эмуляторе, но когда я это сделать:

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); 
} 

I вообще не имеют проблем с производительностью. Как это можно объяснить? Помоги пожалуйста. В краске я использую пользовательские шрифты.

Я пробовал многопоточную обработку. Я создал 10, 100 потоков для списка, каждый поток обработал некоторую часть списка. Но я всегда получаю тот же результат (5 секунд и более). Я использовал AsyncTask.

+0

что список? ArrayList? – Kedarnath

+0

Вы проверили это на реальном устройстве. – theLazyFinder

+0

Да, это список массивов. И приложение работает на реальном устройстве в течение 50 секунд. –

ответ

0

Попробуйте альтернативный путь для повышения производительности,

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

Everytime доступа list.size() в цикл не является хорошей практикой.

+0

Доза не помогает мне –

0

В последнем случае строка не изменяется, поэтому результат кэшируется где-то и не переоценивается.

Если paint.measureText не является дешёвым, вы можете измерить только строки с большим количеством букв. Вы можете быстро ускорить работу до 10x-100x, если вы можете жить с возможностью неточного результата.

Я

  1. Найти самую длинную строку (по количеству букв)
  2. Меры только строки, число букв составляет не менее 70% от самой длинной
Смежные вопросы