杰克逊vs json简单的流解析

时间:2013-04-20 12:49:05

标签: java jackson json-simple

我在github https://github.com/jillesvangurp/jsonj

上有一个json库

这个库有一个基于json simple的解析器,它使用一个处理程序类来完成我在库中创建JsonObject,JsonArray和JsonPrimitive实例的所有工作。

我见过人们发布各种基准测试表明,jackson解析器在性能方面差不多,json simple是较慢的选项之一。因此,为了看看我是否可以提高性能,我创建了一个替代解析器,它使用jackson流API并调用我用于原始解析器的相同处理程序。从功能的角度来看,这很好用,而且很简单。

你可以在这里找到相关的类(JsonHandler,JsonParser和JsonParserNg):https://github.com/jillesvangurp/jsonj/tree/master/src/main/java/com/github/jsonj/tools

但是,我没有看到我运行的各种测试有任何改进。

所以,我的问题是:我是否应该看到任何改善,如果是这样,为什么?在我看来,至少在流API模式下,两个库都具有相似的性能。

我对其他人对此的体验非常感兴趣。

1 个答案:

答案 0 :(得分:9)

我刚才写了“On proper performance testing of Java JSON processing”,列举了我在性能基准测试中遇到的常见问题。有很多相对简单的方法可以搞砸比较。我假设你没有提到任何错误,但值得一提。 特别是关于使用原始输入的部分:真正的JSON数据出现在String的情况很少 - 所以请确保使用InputStream / OutputStream(或字节数组)。

要注意的第二件事是,如果您使用树模型(如JsonObject),您已经添加了许多可能可避免的开销:您正在构建Map / List结构使用POJO会使用的3x内存;而且操作起来比较慢。 在这种情况下,实际的解析/生成开销通常是少数组件。 有时树样式处理是有意义的,这是可以接受的开销。

因此,如果表现很重要,通常要么:

  1. 使用流API构建您自己的对象 - 而不是内存树或
  2. 使用与POJO的数据绑定。这可以接近(1)
  3. 的速度

    这两者都比构建树更快(在某种程度上,序列化)。 出于某种原因,许多开发人员以某种方式假设处理树表示是处理数据的有效方式 - 事实并非如此,并且在诸如https://github.com/eishay/jvm-serializers

    等基准测试中看到了

    我没有通过链接看到与Jackson相关的代码,所以我假设它按预期工作。 要寻找的主要内容(wrt performance probs)实际上是:

    1. 始终关闭JsonParserJsonGenerator(某些回收所需)和
    2. 重用JsonFactory和/或ObjectMapper个实例:它们是线程安全的,通过这些对象重用某些组件(符号表,序列化器)。
    3. 如前所述,如果可能,请始终使用大多数原始输入/输出目的地(InputStreamOutputStream)。
相关问题