gpt4 book ai didi

java - jackson vs json 简单的流解析

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:04 27 4
gpt4 key购买 nike

我在 github 上有一个 json 库 https://github.com/jillesvangurp/jsonj

这个库有一个基于 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 模式下,两个库的性能相似。

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

最佳答案

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

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

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

  1. 使用流式 API 构建您自己的对象——而不是内存中的树,或者
  2. 使用与 POJO 之间的数据绑定(bind)。这可以接近 (1) 的速度

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

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

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

关于java - jackson vs json 简单的流解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16120560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com