首页 文章

Jackson JSON Parser表现

提问于
浏览
7

互联网上的多个帖子指向 Jackson ,因为它具有比GSON更好的解析性能,在接近20-30%的速度提升的地方 .

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

我浏览了 Jackson 维基上的“陷阱”清单,但没有任何东西像红旗那样突出 .

例如,我没有重新创建 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 回答

  • 3

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

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

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

相关问题