@Borsh-na-stole

Спад производительности в Android приложении, из-за GC?

В обычном куске кода у меня имеется падение производительности на 5 секунд.

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

Тестировал в gyenni motion эмуляторе. В реальном устройстве на обработку тратится аж 50 секунд. Но если я зделаю так:

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

То, проблем ни каких нет. Как это можно объяснить? Помогите пожалуйста.
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
enq3
@enq3
Android engineer at #ITX5
Если не важна точность, то можно сделать так:
float symWidth = paint.measureText("X");
for (int i = 0; i < list.size(); i++){        \\ size ~ 30k
        String str = list.get(i);
        float strWidth = symWidth * str.length;
}

Точность далека от идеала, если шрифт не моноширинный, но зато быстро.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
Проблема скорее всего все таки в get и цикле. А второй пример не тормозит потому что get не происходит - оптимизация. Возможно даже не происходит самого цикла.
Ответ написан
Комментировать
@Borsh-na-stole Автор вопроса
Я закомментирую строчку с measureText в 1 примере и все ок, работает быстро.
Выносил Strings str; и int size = list.size() за цикл - не помогло. Паралелил код с помощью AsynkTask, не помогло (каждый поток обрабатывал отдельную часть списка). Еще за место списка массив пробывал, и файловый поток.readLine(), не помогает.
Неужели функция measureText медленная?
Ответ написан
Комментировать
@IdeSade
measureText очень медленная!
Я не представляю зачем считать размер сразу для всех строк...
Может ошибка в логике?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы