Подтвердить что ты не робот

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

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

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

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

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

Некоторые оговорки:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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