Jackson JSON Parser表现

时间:2014-10-08 15:53:19

标签: android json performance jackson gson

互联网上的多个帖子指向杰克逊,因为它具有比GSON更好的解析性能,在附近提供了20-30%的速度提升。

拔出我们的GSON解析器并替换为Jackson导致我的项目减速7倍,每次调用的延迟超过300毫秒。 GSON上的相同解析工作不到50毫秒。

我浏览了杰克逊维基上的“陷阱”清单,但没有任何东西作为红旗突出。

例如,我没有重新创建我的ObjectMapper,我正在使用ObjectReader来读取所有JSON。以下是一些示例代码:

public class JsonParser {
    @Nonnull
    private final ObjectMapper objectMapper;

    public JsonParser() {
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(DateFormatUtil.getGmtIso8601DateFormat());

        SimpleModule simpleModule = new SimpleModule();
        objectMapper.registerModule(simpleModule);
        this.objectMapper = objectMapper;
    }

    public <T> T fromJson(InputStream inputStream, Class<T> clazz) throws IOException {
        ObjectReader reader = objectMapper.reader(clazz);
        return reader.readValue(inputStream);
    }
}

上面的对象被创建一次,并在应用程序的持续时间内用于将JSON转换为POJO。这里可以看到样本POJO:

@JsonSerialize(include= Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ActivityEntity {
    public ActivityObjectEntity actor;
    public ActivityObjectEntity object;
    public ActivityObjectEntity provider;
    public ActivityObjectEntity target;
    public ActivityObjectEntity generator;
    public String content;
    public String title;
    public String verb;
    public String url;
    public Date published;
    public Date updated;
    // other properties omitted ...
}

被序列化的内容实际上是上述项目的列表。

以下是每次运行的示例跟踪视图窗口。注意,这是一个异常现象。我一直从Gson和Jackson解析同一数据集中获得相同的性能顺序。

与Jackson 2.4.2和Gson 2.2.4进行比较

traceview output from Jackson traceview output from Gson

1 个答案:

答案 0 :(得分:3)

代码看起来是正确的,即使在最糟糕的情况下,杰克逊应该不比Gson慢;当然不是任何东西的倍数。

如果你能够为调用堆栈获取一个探查器快照(用于连续运行反序列化10秒以上),那么可能会指出花费多少时间,并且可以帮助找出罪魁祸首。

我仍然会仔细检查JsonParser是不是无意中多次构造的:一个棘手的情况是例如通过Jersey(直接或通过DropWizard)这样的框架可以多次构造资源,除非告知构造和使用单例实例。 我这样说是因为症状很适合这种情况,不是因为我怀疑你没有做过尽职调查。