XML с библиотекой SimpleXML - производительность на Android - PullRequest
12 голосов
/ 20 мая 2011

Я использую Простую библиотеку XML для обработки файлов XML в моем приложении для Android. Эти файлы могут быть довольно большими - около 1 МБ, и могут быть вложены довольно глубоко, поэтому они довольно сложны.

Когда приложение загружает один из этих файлов через Simple API, его выполнение может занять до 30 секунд. В настоящее время я передаю FileInputStream в метод [read (Class, InputStream)] [2] класса Persister Simple. По сути, он просто читает узлы XML и сопоставляет данные с экземплярами объектов моей модели, реплицируя древовидную структуру XML в памяти.

Мой вопрос: как мне улучшить производительность на Android? Моя текущая мысль заключается в том, чтобы прочитать содержимое файла в байтовый массив и передать взамен ByteArrayInputStream в метод чтения Persister. Я полагаю, что время для обработки файла будет быстрее, но я не уверен, что сэкономленное время будет противодействовать времени, потраченному на чтение всего файла первым. Также могут быть проблемы с памятью.

Это поручение дураков? Что еще я мог сделать, чтобы увеличить производительность в этой ситуации? В противном случае мне просто придется прибегнуть к улучшению обратной связи с пользователем о ходе загрузки файла.

Некоторые предостережения:

1) Я не могу изменить используемую библиотеку XML - рассматриваемый код является частью «движка», который используется в настольных, мобильных и веб-приложениях. Расходы на его изменение были бы слишком большими для времени.

2) Файлы данных создаются пользователями, поэтому я не могу контролировать размер / глубину вложения в них.

1 Ответ

16 голосов
/ 02 июня 2011

Ну, есть много вещей, которые вы можете сделать, чтобы улучшить это. Вот они.

1) На Android вы должны использовать как минимум версию 2.5.2, но в идеале 2.5.3, так как она использует KXML, который намного быстрее и эффективнее использует память на Android.

2) Simple будет динамически строить ваш граф объектов, это означает, что ему нужно будет загрузить классы, которые еще не были загружены, и построить схему для каждого класса на основе его аннотаций с использованием отражения. Поэтому первое использование всегда будет самым дорогим. Повторное использование одного и того же постоянного экземпляра будет во много раз быстрее. Поэтому старайтесь избегать нескольких постоянных экземпляров, просто используйте один, если это возможно.

3) Попробуйте измерить время, необходимое для чтения файла напрямую, без использования библиотеки Simple XML. Сколько времени это занимает? Если это занимает вечность, то вы знаете, что снижение производительности происходит из-за файловой системы. Попробуйте использовать BufferedInputStream для повышения производительности.

4) Если вы все еще замечаете какие-либо проблемы, поднимите их в списке рассылки.

EDIT: В Android есть некоторые проблемы с обработкой аннотаций https://code.google.com/p/android/issues/detail?id=7811, В простых исправлениях 2.6.6 реализованы способы обхода этих проблем. Наблюдается увеличение производительности в 10 раз.

...