2011-10-12 2 views
6

Dopo aver cercato su google, ho scoperto che jackson ha prestazioni migliori di gson, ho intenzione di sostituire gson con jackson nel mio progetto, ma ho ottenuto un risultato diverso quando eseguo il codice di test.json parse performance tra jackson e gson

private static final Type PHOTOLINKS_TYPE_GSON = new TypeToken<List<Photo>>() {}.getType(); 
private static final Type PHOTOCAPTIONS_TYPE_GSON = new TypeToken<List<String>>() {}.getType(); 
Gson gson = new Gson(); 
private void testGson(String photoJson, String captionJson) { 
    GSON_MON.start(); 
    List<Photo> photos = gson.fromJson(photoJson, PHOTOLINKS_TYPE_GSON); 
    List<String> photoCaptions = gson.fromJson(captionJson, PHOTOCAPTIONS_TYPE_GSON); 
    GSON_MON.stop(); 
} 

TypeReference<List<Photo>> PHOTOLINKS_TYPE_JACKSON = new TypeReference<List<Photo>>(){}; 
TypeReference<List<String>> PHOTOCAPTIONS_TYPE_JACKSON = new TypeReference<List<String>>(){}; 
ObjectMapper mapper = new ObjectMapper(); 
private void testJackson(String photoJson, String captionJson) { 
    JACKSON_MON.start(); 
    try { 
     List<Photo> photos = mapper.readValue(photoJson, PHOTOLINKS_TYPE_JACKSON); 
     List<String> photoCaptions = mapper.readValue(captionJson, PHOTOCAPTIONS_TYPE_JACKSON); 
    } catch (JsonParseException e) { 
     e.printStackTrace(); 
    } catch (JsonMappingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    JACKSON_MON.stop(); 
} 

Photo è una classe normale:

@JsonIgnoreProperties(ignoreUnknown = true) 
private static class Photo implements Serializable { 
private static final long serialVersionUID = 5645393489907650496L; 

public String small; 
public String middle; 
public String orign; 
public String caption; 
public String ow; 
public String oh; 
} 

e la foto JSON è qualcosa di simile: [{ "id": "1.318.403,074887 millions", "Origine": "xxx.jpg"," ow ": 427," piccolo ":" xxx.jpg", "medio": "xxx.jpg", "oh": 640}, { "id": "1.318.403,076793 millions", "Origine": "xxx.jpg" , "ow": 640, "piccolo": "xxx.jpg", "medio": "xxx.jpg", "oh": 480}, { "id": "1.318.403,092168 millions", "Origine": "xxx. jpg", "ow": 425, "piccolo": "xxx.jpg", "medio": "xxx.jpg", "oh": 640}]

io uso JAMon al moniter la perfomance, sotto è il risultato:

  • JAMon Etichetta = Jackson, Unità = ms .: (LastValue = 18,0, Hits = 30,0, Avg = 18,4, totale = 552,0, Min = 13.0, Max = 37.0, Attivo = 0.0, AVG Active = 1.0, Max attivo = 1,0)
  • JAMon Etichetta = gson, Unità = ms .: (LastValue = 4.0, Hits = 30.0, Avg = 2.1666666666666665, Totale = 65.0, Min = 0.0, Max = 4.0, Attivo = 0.0, Attivo medio = 1.0, Max Active = 1.0)
  • JAMon Etichetta = jackson, Unità = ms .: (LastValue = 20.0, Hits = 30.0, Avg = 15.166666666666666, Totale = 455.0, Min = 12.0, Max = 25.0, Attivo = 0.0, Avg Attivo = 1,0, Massimo attivo = 1,0)
  • Etichetta JAMon = gson, Unità = ms .: (LastValue = 4.0, Hits = 30.0, Avg = 2,2, Total = 66.0, Min = 0.0, Max = 9.0, Active = 0 . 0, attivo medio = 1,0, attivo massimo = 1,0)
  • Etichetta JAMon = jackson, unità = ms .: (LastValue = 19.0, Hits = 30.0, Avg = 16.433333333333334, Total = 493.0, Min = 11.0, Max = 51.0, Attivo = 0.0, Attivo medio = 1.0, Attivo massimo = 1.0)
  • Etichetta JAMon = gson, Unità = ms .: (LastValue = 2.0, Hits = 30.0, Avg = 1.9, Total = 57.0, Min = 0.0, Max = 6.0, attivo = 0.0, AVG Active = 1,0, Max attivo = 1,0)

sembra GSON è più veloce di Jackson, il tempo medio di GSON è di circa 2 ms, mentre Jackson è di circa 16 ms, non faccio errore quando usando Jackson?

risposta

5

Potrebbe essere un problema con il monitoraggio delle prestazioni: sembra che tu non stia "scaldando" JVM eseguendo i test per un tempo sufficiente a consentire la compilazione del codice byte e così via. In genere i test devono essere eseguiti almeno per 5-10 secondi prima di eseguire le misurazioni.

Quindi forse provate a farlo prima, vedete come cambiano i numeri. Scommetto che i numeri per entrambi aumenteranno - dovrebbe richiedere una frazione di millisecondo per i piccoli oggetti.

+2

sì, hai ragione. Corro di nuovo test e monitor utilizzando nanosecondi, Jackson è più veloce di GSON: jackson totale: 4742510320ns, avg: 4742510ns GSON totale: 13498619947ns, avg: 13498619ns Jackson totale: 7667802989ns, avg: 7667802ns GSON totale: 25132581619ns, media: 25132581ns – situch

+0

ok bene, questo ha senso. felice che ha funzionato! – StaxMan

+0

+1 per queste informazioni, mi è successa una cosa simile e dopo aver eseguito il test più volte il tempo di esecuzione è stato ridotto di un fattore 4 –