我在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模式下,两个库都具有相似的性能。
我对其他人对此的体验非常感兴趣。
答案 0 :(得分:9)
我刚才写了“On proper performance testing of Java JSON processing”,列举了我在性能基准测试中遇到的常见问题。有很多相对简单的方法可以搞砸比较。我假设你没有提到任何错误,但值得一提。
特别是关于使用原始输入的部分:真正的JSON数据出现在String
的情况很少 - 所以请确保使用InputStream
/ OutputStream
(或字节数组)。
要注意的第二件事是,如果您使用树模型(如JsonObject
),您已经添加了许多可能可避免的开销:您正在构建Map
/ List
结构使用POJO会使用的3x内存;而且操作起来比较慢。
在这种情况下,实际的解析/生成开销通常是少数组件。
有时树样式处理是有意义的,这是可以接受的开销。
因此,如果表现很重要,通常要么:
这两者都比构建树更快(在某种程度上,序列化)。 出于某种原因,许多开发人员以某种方式假设处理树表示是处理数据的有效方式 - 事实并非如此,并且在诸如https://github.com/eishay/jvm-serializers
等基准测试中看到了我没有通过链接看到与Jackson相关的代码,所以我假设它按预期工作。 要寻找的主要内容(wrt performance probs)实际上是:
JsonParser
和JsonGenerator
(某些回收所需)和JsonFactory
和/或ObjectMapper
个实例:它们是线程安全的,通过这些对象重用某些组件(符号表,序列化器)。InputStream
,OutputStream
)。