【问题标题】:Jackson JSON Parser performanceJackson JSON 解析器性能
【发布时间】:2014-10-08 15:53:18
【问题描述】:

Internet 上的多篇文章指出,Jackson 的解析性能比 GSON 更好,速度大约提高了 20-30%。

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

我浏览了 Jackson Wiki 上的“陷阱”列表,但没有任何东西作为危险信号。

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

【问题讨论】:

    标签: android json performance jackson gson


    【解决方案1】:

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

    如果您能够获得调用堆栈的分析器快照(用于连续运行反序列化 10 多秒),那可能会指出花费过多时间的位置,并有助于找出罪魁祸首。

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

    【讨论】:

    • 每次创建对象时我都会在代码中登录,并且它只在启动时发生一次,因此绝对不会被多次创建。
    • 看起来我从 Android 的跟踪视图中得到了误导性的跟踪。探查器突出显示了我只能假设的是初始化跟踪。当我在 JUnit 测试中循环运行代码并比较时间时,Jackson 大约快 10%。
    • 请注意,Android 上的性能与桌面 Java 上的性能无关。 Gson 针对 Android 进行了优化,因此在您第一次解析文档时速度很快。当您解析大量文档时,其他解析器会针对吞吐量进行调整。
    • FWIW,扣除初始解析器构建成本,对 Android 运行时的进一步跟踪显示,Jackson 比 Gson 快得多。
    • 我同意@JesseWilson,这里有不同的策略。最后一点是(还有)另一种可能性是Jackson Jr (github.com/FasterXML/jackson-jr),它的首次使用开销也较低,并且更适合 Android 用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多