XML с библиотекой SimpleXML-производительность на Android

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

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

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

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

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

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

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

1 ответов


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

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

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

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

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

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