2011-10-12 23 views
6

在google搜索後,發現jackson比gson有更好的性能,我打算用我的項目中的jackson替換gson,但運行測試代碼時得到了不同的結果。json解析jackson和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(); 
} 

照片是一個普通的類:

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

和照片JSON是這樣的: [{ 「ID」: 「1318403074887」, 「生產地」: 「XXX.JPG」,」嗷嗷 「:427,」 小 「:」 XXX.JPG」, 「中」: 「XXX.JPG」, 「哦」:640},{ 「ID」: 「1318403076793」, 「生產地」: 「XXX.JPG」 「嗷嗷」:640, 「小」: 「XXX.JPG」, 「中」: 「XXX.JPG」, 「哦」:480},{ 「ID」: 「1318403092168」, 「生產地」:「XXX。 jpg「,」ow「:425,」small「:」xxx.jpg「,」middle「:」xxx.jpg「,」oh「:640}]

我使用JAMon來監聽性能,結果:

  • 火腿標籤=傑克遜,單元數= MS:(LastValue = 18.0,命中= 30.0,平均= 18.4,總= 552.0,最小值= 13.0,最大值= 37.0,活性= 0.0,平均活性= 1.0, MaxActive = 1.0)
  • JAMon Label = gson,Units = ms .:(LastValue = 4.0,Hits = 30.0,Avg = 2.1666666666666665,Total = 65.0,Min = 0.0,Max = 4.0,Active = 0.0,Avg Active = 1.0,Max Active = 1.0)
  • JAMon Label = jackson,Units = ms .:(LastValue = 20.0,Hits = 30.0,Avg = 15.166666666666666,Total = 455.0,Min = 12.0,Max = 25.0,Active = 0.0,Avg激活= 1.0,最大激活= 1.0)
  • JAMon Label = gson,Units = ms .:(LastValue = 4.0,Hits = 30.0,Avg = 2.2,Total = 66.0,Min = 0.0,Max = 9.0,Active = 0 。 0,Avg Active = 1.0,Max Active = 1.0)
  • JAMon Label = jackson,Units = ms .:(LastValue = 19.0,Hits = 30.0,Avg = 16.433333333333334,Total = 493.0,Min = 11.0,Max = 51.0,有效= 0.0,平均有效= 1.0,最大有效= 1.0)
  • JAMon Label = gson,Units = ms .:(LastValue = 2.0,Hits = 30.0,Avg = 1.9,Total = 57.0,Min = 0.0,Max = 6.0,活性= 0.0,平均主動= 1.0,最大活動= 1.0)

似乎GSON比傑克遜更快捷,GSON的平均時間約爲2毫秒,而傑克遜是約16毫秒,確實我犯錯的時候使用傑克遜?

回答

5

這可能是性能監視的一個簡單問題:通過運行測試足夠長的時間讓它編譯字節碼等等,看起來您並不是「熱身」JVM。通常在進行測量之前,測試需要至少運行5-10秒。

因此,也許首先要做的是看看數字是如何變化的。我敢打賭,兩者的數字都會增加 - 對於小物體來說,它應該只需要幾分之一毫秒。

+2

是的,你是對的。 我再次運行測試,並使用納秒監控, 傑克遜比GSON快: 傑克遜總:4742510320ns,AVG:4742510ns GSON總:13498619947ns,AVG:13498619ns 傑克遜總:7667802989ns,AVG:7667802ns GSON總: 25132581619ns,平均:25132581ns – situch

+0

好吧,這是有道理的。很高興它解決了! – StaxMan

+0

+1這個信息,類似的事情發生在我身上,經過幾次測試後,執行時間減少了4倍 –