2010-07-16 13 views
14

Sto cercando di utilizzare gson per eseguire il mapping degli oggetti sull'emulatore Android.android: prestazioni gson

È stato ridicolmente lento durante l'elaborazione di dati json circa 208 kb. Non ho gerarchie nel mio io.

Dopo aver eseguito la mappatura dell'oggetto, posso vedere che gson ha creato circa 500 record.

L'emulatore di Android impiega più di 3 minuti per mappare l'input json.

Ho annotato la mia entità che comprende stringhe e coppie di galleggianti.

Mi manca qualcosa?

Tutte le idee, le migliori pratiche sarebbero di grande aiuto.

Esistono modi per mappare velocemente i dati 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

Si prega di non utilizzare l'emulatore Android per la misurazione delle prestazioni. Il suo modello di prestazioni è significativamente diverso da quello di un dispositivo reale. –

risposta

2

si sarebbe probabilmente ottenere prestazioni migliori e se hai spostato il numero InputStream in un BufferedInputStream con un bel buffer grande ...

3 minuti è folle. Eseguo raramente l'emulatore, ma ho un'app con un asset JSON da ~ 1.1 MB e richiede circa 5 secondi per caricare ed elaborare l'hardware.

(che è ancora troppo lungo, ma ancora).

+0

Sto combattendo con lo stesso problema. Hai un tutorial online che descrive la tua soluzione? –

4

Hai provato a mixare il parser di streaming GSON con l'oggetto Gson? http://sites.google.com/site/gson/streaming (cercare l'esempio di lettura mista).

Questo approccio può essere d'aiuto poiché Gson legge un intero albero di analisi e quindi agisce su di esso. Con un elenco di array di grandi dimensioni, la lettura di tutti gli elementi e il tentativo di analizzare possono causare molti swap di memoria (o thrashing). Questo approccio verrà letto in un elemento alla volta.

Spero che questo aiuti.

+2

+1: l'approccio DOM su GSON è rapido da implementare, ma molto lento nel processare risposte di grandi dimensioni. Lo uso per i prototipi e quindi ottimizzo fino al metodo Streaming per la produzione. Penso che più persone debbano realizzare che GSON non è così lento, è come lo si usa (non è detto che sia il più veloce, solo che molti non usano lo streaming) –

1

Ho scoperto che posso accelerare notevolmente gson.fromJSON non modellando tutti gli elementi nel JSON di cui non avrò bisogno. GSON riempirà felicemente solo ciò che è specificato nelle tue classi di risposta.

0

Ho scoperto che CREARE un'istanza di Gson è un'operazione molto costosa, sia in termini di CPU utilizzata che di memoria allocata.

Poiché le istanze di Gson sono sicure per i thread, la costruzione e il riutilizzo di una singola istanza statica paga, specialmente se si esegue la serializzazione/deserializzazione spesso.