我在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模式下,这两个库具有相似的性能。
我对其他人在这方面的经验非常感兴趣。
发布于 2013-04-22 03:48:14
我不久前写了"On proper performance testing of Java JSON processing“,列举了我在性能基准测试中看到的常见问题。有很多相对简单的方法来搞乱比较。我假设你没有犯任何提到的错误,但值得一提的是。特别是关于使用原始输入的部分:很少有实际的JSON数据是以String形式出现的--因此请确保使用InputStream / OutputStream (或字节数组)。
第二件要注意的事情是,如果您使用树模型(如JsonObject),您已经增加了许多潜在的可避免的开销:您正在构建一个Map/List结构,该结构使用POJO将使用的3倍内存;并且操作起来更慢。在这种情况下,实际解析/生成开销通常是少数组件。有时树型处理是有意义的,这是可以接受的开销。
因此,如果性能非常重要,通常是以下两种之一:
的速度
这两种方法都比构建树(在某种程度上,序列化)更快。出于某种原因,许多开发人员认为处理树表示是处理数据的最有效的方法--事实并非如此,在https://github.com/eishay/jvm-serializers等基准测试中也可以看到这一点
我没有通过链接看到与Jackson相关的代码,所以我假设它可以像预期的那样工作。主要要看的(wrt性能问题)实际上是:
JsonParser和JsonGenerator (某些回收需要)和JsonFactory和/或ObjectMapper实例:它们是线程安全的,某些组件(符号表、序列化程序)的重用是通过这些对象进行的。如前所述,如果可能,请始终使用大多数原始输入/输出目标(d24、https://stackoverflow.com/questions/16120560
复制相似问题