2011-10-12 15 views
6

Po przeszukaniu w google, okazało się, że jackson ma lepszą wydajność niż gson, mam zamiar zastąpić gson z jackson w moim projekcie, ale mam inny wynik, gdy uruchomić kod testowy.json analizować wydajność między jackson i 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 to normalna klasa:

@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; 
} 

i zdjęcia json jest coś takiego: [{ "id": "1318403074887", "BIEGU": "xxx.jpg",” ow ": 427," small ":" xxx.jpg "," middle ":" xxx.jpg "," oh ": 640}, {" id ":" 1318403076793 "," orign ":" xxx.jpg " "ow": 640, "mały": "xxx.jpg", "środkowy": "xxx.jpg", "oh": 480}, {"id": "1318403092168", "orign": "xxx. jpg "," ow ": 425," mały ":" xxx.jpg "," środkowy ":" xxx.jpg "," oh ": 640}]

Używam JAMON do moniter wydajności, poniżej jest wynik:

  • szynka Etykieta = Jackson = jednostek MS .: (LastValue = 18,0, Ilość = 30,0, Średnia = 18,4, całkowita = 552,0, min = 13,0, max = 37,0, Aktywne = 0,0, Śr Aktywne = 1,0; Max Active = 1.0)
  • Etykieta JAMon = gson, Jednostki = ms .: (LastValue = 4,0, Hity = 30,0, Avg = 2,16666666666666665, Razem = 65,0, Min. = 0,0, Maksimum = 4,0, Aktywne = 0,0, Średnia aktywność = 1.0, Max Active = 1.0)
  • Etykieta JAMON = jackson, Jednostki = ms .: (LastValue = 20.0, Hity = 30.0, Avg = 15.166666666666666, Łącznie = 455,0, Min. = 12,0, Maksimum = 25,0, Aktywne = 0,0, Średnia Aktywny = 1,0, maks. Aktywny = 1,0)
  • Etykieta JAMon = gson, Jednostki = ms .: (LastValue = 4,0, Hity = 30,0, Avg = 2,2, Łącznie = 66,0, Min. = 0,0, Maksimum = 9,0, Aktywne = 0 . 0, Śr. Aktywny = 1,0, Maks. Aktywny = 1.0)
  • Etykieta JAMon = jackson, Jednostki = ms .: (Ostatnia wartość = 19,0, Odsłonięcia = 30.0, Śr = 16,433333333333334, Razem = 493,0, Min. = 11,0, Maks. = 51,0, Aktywny = 0,0, Śr. Aktywny = 1,0, Maks. Aktywny = 1,0)
  • Etykieta JAMon = gson, Jednostki = ms .: (LastValue = 2,0, Hity = 30,0, Avg = 1,9, Razem = 57,0, Min. = 0,0, Max = 6.0 Aktywne = 0,0, Średnia Aktywny = 1.0, Max Aktywny = 1,0)

wydaje gson jest bardziej szybciej niż Jackson, średni czas gson wynosi około 2 ms podczas Jackson wynosi około 16ms, czy robię błąd, kiedy używając jackson?

Odpowiedz

5

Może to być prosty problem z monitorowaniem wydajności: wygląda na to, że nie "rozgrzewasz" maszyny JVM, uruchamiając testy wystarczająco długo, aby pozwolić na kompilację kodu bajtowego i tak dalej. Zazwyczaj testy należy przeprowadzać co najmniej 5-10 sekund przed wykonaniem pomiarów.

Więc może najpierw spróbuj to zrobić, zobacz jak zmieniają się liczby. Założę się, że liczby dla obu wzrosną - powinno to zająć ułamek milisekundy dla małych obiektów.

+2

tak, masz rację. ponownie uruchomić test, i monitorować za pomocą nanosekund, Jackson jest szybszy niż gson: JACKSON Wszystkich: 4742510320ns AVG: 4742510ns gson Razem: 13498619947ns, avg: 13498619ns JACKSON Wszystkich: 7667802989ns, avg: 7667802ns gson sumie: 25132581619ns, śr .: 25132581ns – situch

+0

OK, to ma sens. Cieszę się, że się udało! – StaxMan

+0

+1 za te informacje, podobna rzecz przydarzyła mi się i po kilkukrotnym uruchomieniu testu czas wykonania został zmniejszony o współczynnik 4 –