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

sit*_*uch 6 performance json jackson gson

在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();
}
Run Code Online (Sandbox Code Playgroud)

照片是正常的课程:

@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;
}
Run Code Online (Sandbox Code Playgroud)

照片json是这样的:[{"id":"1318403074887","orign":"xxx.jpg","ow":427,"small":"xxx.jpg","middle":"xxx .JPG", "哦":640},{ "ID": "1318403076793", "生产地": "XXX.JPG", "嗷嗷":640, "小": "XXX.JPG", "中": "XXX.JPG", "哦":480},{ "ID": "1318403092168", "生产地": "XXX.JPG", "嗷嗷":425, "小": "XXX.JPG","中":" XXX.JPG", "哦":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.433333333333334,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时我犯了错误吗?

Sta*_*Man 5

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

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

  • 是的,你是对的.我再次运行测试,并且监测使用纳秒,杰克逊比gson更快:杰克逊总数:4742510320ns,平均值:4742510ns gson总计:13498619947ns,平均值:13498619ns杰克逊总数:7667802989ns,平均值:7667802ns gson总计:25132581619ns,平均值:25132581ns (2认同)