6

After searched in google, found that jackson has better performance than gson, i plan to replace gson with jackson in my project, but i got a diffrent result when run test code.

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 is a normal class:

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

and the photo json is something like: [{"id":"1318403074887","orign":"xxx.jpg","ow":427,"small":"xxx.jpg","middle":"xxx.jpg","oh":640},{"id":"1318403076793","orign":"xxx.jpg","ow":640,"small":"xxx.jpg","middle":"xxx.jpg","oh":480},{"id":"1318403092168","orign":"xxx.jpg","ow":425,"small":"xxx.jpg","middle":"xxx.jpg","oh":640}]

i use JAMon to moniter the perfomance, below is the result:

  • 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.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 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)

it seems gson is more faster than jackson, the average time of gson is about 2ms while jackson is about 16ms, does i make mistake when using jackson?

situch
  • 103
  • 1
  • 4

1 Answers1

5

It may be simple issue with performance monitoring: looks like you are not "warming up" JVM by running tests for long enough to let it compile byte code and so on. Typically tests need to be run at least for 5 - 10 seconds before taking measurements.

So perhaps try doing that first, see how numbers change. I bet numbers for both will increase -- it should take a fraction of a millisecond for small objects.

StaxMan
  • 113,358
  • 34
  • 211
  • 239
  • 2
    yes,you are right. I run test again, and monitor using nanoseconds, jackson is faster than gson: jackson total:4742510320ns,avg:4742510ns gson total:13498619947ns,avg:13498619ns jackson total:7667802989ns,avg:7667802ns gson total:25132581619ns,avg:25132581ns – situch Oct 13 '11 at 02:08
  • +1 for this info, a similar thing happened to me and after running the test several times the execution time was reduced by a factor of 4 – Juan Antonio Gomez Moriano May 02 '13 at 23:20