Java jackson vs json用于流解析

Java jackson vs json用于流解析,java,jackson,json-simple,Java,Jackson,Json Simple,我在github上有一个json库 这个库有一个基于json simple的解析器,它使用一个处理程序类来完成创建库中JsonObject、JsonArray和JsonPrimitive实例的所有工作 我看到有人发布了各种基准测试,表明jackson解析器在性能方面与它得到的一样好,json simple是较慢的选项之一。因此,为了看看是否可以提高性能,我创建了一个替代解析器,它使用jackson流API并调用与原始解析器相同的处理程序。从功能的角度来看,这很好,而且非常简单 您可以在此处找到相

我在github上有一个json库

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

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

您可以在此处找到相关类(JsonHandler、JsonParser和JsonParserNg):

然而,我没有看到我运行的各种测试有任何改进

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

我对其他人在这方面的经验非常感兴趣。

我刚才写了“”,列举了我在绩效基准测试中遇到的常见问题。有很多相对简单的方法可以搞乱比较。我假设你没有犯上述任何错误,但值得一提。 特别是关于使用原始输入的部分:很少有情况下真正的JSON数据是以字符串形式出现的,因此请确保使用
InputStream
/
OutputStream
(或字节数组)

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

因此,如果性能非常重要,通常可以:

  • 使用流式API构建您自己的对象,而不是内存中的树,或者
  • 使用与POJO之间的数据绑定。这可能接近(1)的速度
  • 这两种方法都比构建树(在某种程度上,序列化)要快。 出于某种原因,许多开发人员都认为处理树表示和处理数据一样有效——事实并非如此,在诸如

    我没有通过link看到与Jackson相关的代码,所以我假设它能按预期工作。 要寻找的主要问题(wrt性能问题)实际上是:

  • 始终关闭
    JsonParser
    JsonGenerator
    (某些回收需要)和
  • 重用
    JsonFactory
    和/或
    ObjectMapper
    实例:它们是线程安全的,通过这些对象重用某些组件(符号表、序列化程序)
  • 如前所述,尽可能使用大多数原始输入/输出目标(
    InputStream
    OutputStream

  • 这不是一个解决方案,也不是对您实际问题的回答,但根据他们自己的基准测试,json smart是他们测试的所有测试中速度最快的,包括json simple和jackson。此外,它使用与json simple完全相同的接口,因此迁移应该是一个快照。然而,同一个网站上的很多评论都说人们得到了不同的结果,所以YMMV。谢谢,我也可以尝试一下。根据任何公开的基准测试,Json-smart并不比其他方法更快。其项目页面中提到的基准有评论所暗示的缺陷;包括使用奇怪的数据({“value”:123}等等——真的吗?)。谢谢,我也这么怀疑。我设计的库都是关于树结构的,所以我对此无能为力。我实际上没有意识到我需要关闭解析器,所以我只是修复了它。是的,我认为使用更灵活的模型可能是有原因的。“我希望结束语在某种程度上有所帮助,但差异可能不是天文数字。”斯塔克斯曼我注意到你在序列化方面的专长。如果你有时间,请看一看。KR,抱歉打扰你了。