杰森解析杰克逊和格森之间的表现

时间:2011-10-12 08:02:57

标签: performance json gson jackson

在google搜索后,发现jackson的性能比gson好,我打算在我的项目中用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”, “流”:425, “小”: “XXX.JPG”, “中”: “XXX.JPG”, “OH”:640}]

我使用JAMon监视性能,下面是结果:

  • JAMon Label = jackson,Units = ms。:( LastValue = 18.0,Hits = 30.0,Avg = 18.4,Total = 552.0,Min = 13.0,Max = 37.0,Active = 0.0,Avg Active = 1.0,Max Active = 1.0)
  • JAMon Label = gson,Units = ms。:( LastValue = 4.0,Hits = 30.0,Avg = 2.166666666666666665,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 Active = 1.0,Max Active = 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.43333333333333434,Total = 493.0,Min = 11.0,Max = 51.0,Active = 0.0,Avg Active = 1.0,Max Active = 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,Active = 0.0,Avg Active = 1.0,Max Active = 1.0)

似乎gson比jackson更快,gson的平均时间约为2ms而jackson约为16ms,使用jackson时是否会出错?

1 个答案:

答案 0 :(得分:5)

性能监视可能是一个简单的问题:看起来你不是通过运行测试足够长时间让它编译字节代码来“预热”JVM等等。通常,在进行测量之前,测试需要至少运行5-10秒。

所以也许先尝试一下,看看数字是如何变化的。我打赌两者的数字都会增加 - 对于小物体,它应该只需要几分之一毫秒。