XML con la biblioteca SimpleXML – Rendimiento en Android

Estoy utilizando la biblioteca Simple XML para procesar archivos XML en mi aplicación de Android. Estos archivos pueden llegar a ser bastante grandes – alrededor de 1Mb, y se pueden anidar muy profundamente, por lo que son bastante complejos.

Cuando la aplicación carga uno de estos archivos, a través de la API simple, puede tardar hasta 30 segundos en completarse. Actualmente estoy pasando un FileInputStream en el método [read (Class, InputStream)] [2] de la clase Persister de Simple. Efectivamente, solo lee los nodos XML y mapea los datos a instancias de mis objetos de modelo, replicando la estructura de árbol XML en la memoria.

Mi pregunta entonces es ¿cómo puedo mejorar el rendimiento en Android? Mi pensamiento actual sería leer el contenido del archivo en una matriz de bytes y pasar un ByteArrayInputStream al método de lectura de Persister en su lugar. Me imagino que el tiempo para procesar el archivo sería más rápido, pero no estoy seguro de si el tiempo ahorrado sería contrarrestado por el tiempo necesario para leer todo el archivo primero. También las restricciones de memoria pueden ser un problema.

¿Es esto un mandado de tontos? ¿Hay algo más que pueda hacer para aumentar el rendimiento en esta situación? Si no, sólo tendré que recurrir a la mejora de la retroalimentación al usuario sobre el progreso de la carga del archivo.

Algunas advertencias:

1) No puedo cambiar la biblioteca XML que estoy usando – el código en cuestión es parte de un "motor" que se utiliza en aplicaciones de escritorio, móviles y web. La sobrecarga para cambiarlo sería demasiado para el tiempo.

2) Los archivos de datos son creados por los usuarios por lo que no tienen control sobre el tamaño / profundidad de anidar en ellos.

Bueno, hay muchas cosas que puedes hacer para mejorar esto. Aquí están.

1) En Android usted debe utilizar por lo menos la versión 2.5.2, pero idealmente 2.5.3 como él utiliza KXML que es mucho más rápido y más memoria eficiente en Android.

2) Simple construirá dinámicamente su gráfico de objetos, esto significa que tendrá que cargar las clases que no se han cargado ya, y construir un esquema para cada clase basado en sus anotaciones usando la reflexión. Así que el primer uso será siempre el más caro. El uso repetido de la misma instancia persister será muchas veces más rápido. Así que trate de evitar varias instancias de persister, sólo use uno si es posible.

3) Trate de medir el tiempo necesario para leer el archivo directamente, sin utilizar la biblioteca Simple XML. ¿Cuánto tiempo se tarda? Si tarda una eternidad entonces usted sabe que el éxito de rendimiento aquí es debido al sistema de archivos. Intente utilizar un BufferedInputStream para mejorar el rendimiento.

4) Si todavía nota algún problema, levántelo en la lista de correo.

EDIT: Android tiene algunos problemas con el procesamiento de anotaciones https://code.google.com/p/android/issues/detail?id=7811 , Simple 2.6.6 correciones ha implementado arounds de trabajo para estos problemas. Se pueden observar aumentos de rendimiento de 10 veces.

  • Android: Añadir una vista de texto al diseño lineal mediante programación
  • Error XML al agregar Google Analytics a mi aplicación
  • Cambiar el color del texto de TimePicker
  • AndroidManifest.xml con varias etiquetas de aplicación
  • Archivo binario línea # 8: Error al inflar el fragmento de la clase, Google Maps
  • Import xml en otro xml
  • Post datos UTF-8 codificados en el servidor pierde ciertos caracteres
  • AOSP AndroidManifest.xml
  • ImageView no se extiende (Android)?
  • Espacio entre editText y softkeyboard
  • Eclipse no abrirá archivos Xml de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.