2010-07-16 13 views
14

Estoy tratando de usar gson para hacer mi asignación de objetos en el emulador de Android.android: gson rendimiento

Ha sido ridículamente lento al procesar datos json alrededor de 208 kb. No tengo ninguna jerarquía en mi json.

Después de realizar la asignación de objetos, puedo ver que gson creó alrededor de 500 registros.

Tarda más de 3 minutos en el emulador de Android para asignar la entrada json.

He anotado mi entidad que se compone de cadenas y un par de flotadores.

¿Falta algo?

Cualquier idea, mejores prácticas sería de gran ayuda.

¿Hay alguna forma de asignar rápidamente objetos a los datos json?

 URL myURL = new URL(url); 
     /* Open a connection to that URL. */ 
     URLConnection ucon = myURL.openConnection(); 
     /* 
     * Define InputStreams to read from the URLConnection. 
     */ 
     InputStream is = ucon.getInputStream(); 
     InputStreamReader reader = new InputStreamReader(is); 
     long tickCount = System.currentTimeMillis(); 
     Policy[] policies = new Gson().fromJson(reader, Policy[].class); 
     long endCount = System.currentTimeMillis() - tickCount; 
     Log.d("Time to pull policies in milliseconds", "" + endCount); 
+0

No utilice el emulador de Android para medir el rendimiento. Su modelo de rendimiento es significativamente diferente del de un dispositivo real. –

Respuesta

5

que he visto este tipo de preguntas vienen antes, y el consenso general es que Jackson es mucho más rápido que Gson. Consulte los siguientes enlaces para obtener más información:

Aquí está uno que trata específicamente Android: http://ubikapps.net/?p=525

2

lo que probablemente obtener un mejor rendimiento e si envuelve ese InputStream en un BufferedInputStream con un buen gran buffer ...

3 minutos es una locura. Rara vez ejecuto el emulador, pero tengo una aplicación con un activo JSON de ~ 1.1MB y eso demora alrededor de 5 segundos en cargarse y procesarse en el hardware.

(que todavía es demasiado largo, pero aún así).

+0

Estoy peleando con el mismo problema. ¿Tienes un tutorial en línea que describe tu solución? –

4

¿Has probado la mezcla del analizador de transmisión GSON con el objeto Gson? http://sites.google.com/site/gson/streaming (busque el ejemplo de lectura mixta).

Este enfoque puede ayudar ya que Gson lee en un árbol de análisis completo y luego actúa sobre él. Con una lista de matriz grande, leer en todos los elementos e intentar analizar puede causar muchos intercambios de memoria (o agitación). Este enfoque se leerá en un elemento a la vez.

Espero que esto ayude.

+2

+1 - el enfoque DOM en GSON es rápido de implementar, pero realmente lento para procesar respuestas grandes. Lo uso para prototipos y luego optimizo hasta el método Streaming para producción. Creo que más personas necesitan darse cuenta de que GSON no es tan lento, es cómo lo usas (no diciendo que es el más rápido, solo que muchos no usan transmisión) –

1

He descubierto que puedo acelerar gson.fromJSON bastante considerablemente al no modelar todos los elementos en el JSON que no necesitaré. GSON estará feliz de completar solo lo que se especifica en sus clases de respuesta.

0

He encontrado que CREAR una instancia de Gson es una operación muy costosa, tanto en términos de CPU utilizada como de memoria asignada.

Dado que las instancias de Gson son seguras para la ejecución de subprocesos, la construcción y reutilización de una única instancia estática rinde sus frutos, especialmente si está serializando/deserializando a menudo.