如何加快javax.json.stream.JsonGenerator的速度?

时间:2017-01-31 09:29:18

标签: java json performance serialization

我终于重构一个宁静的Web服务,它产生json输出以使用实际的json lib,而不是将json手动构建到StringBuilder中,然后将其打印到输出中。 速度至关重要,目前我看到主题表现非常差。 我有一个小的基准测试,其中4个线程共同执行~4k请求,这需要使用StringBuilder约5,5s,使用JsonGenerator需要134s。 我希望我做错了什么。 我正在遵循本指南:http://www.journaldev.com/2315/java-json-example

我是否应该考虑其他库以获得速度?我真的更喜欢使用oracle libs,因为它们已经出现在我的应用服务器上(玻璃鱼)

更新

这确实是一个错误 - 但我确实经历了实施我自己的JsonGenerator的动作,它似乎比任何替代方案都要好得多:

  • StringBuilder:4319 ms
  • FastJsonGenerator拍摄时间:1969 ms(我的宝贝)
  • JsonGenerator拍摄:3550毫秒(Json.createJsonGenerator)
  • JsonObject花了:84829 ms(javax.json.JsonObjectBuilder)

我将代码放到GitHub上:https://github.com/steffenschumacher/FastJsonGenerator 我的懒惰使我无法进行适当的测试,最终导致我花费的时间超过了所需的时间。我原来的测试存在缺陷:

  • 依赖于数据库连接来获取真实数据
  • 花费CPU时间解析json答案
  • 花了CPU时间实际通过本地http传递响应。

GitHub代码将输出写入/ dev / null并且不解析,并且不使用动态数据,而是使用事先实例化的数据。 感谢所有的指示 - 我想我现在有了我需要的东西。

1 个答案:

答案 0 :(得分:0)

对于javax.json.stream.JsonGenerator,似乎它应该和StringBuilder一样快(但是有适当的,可能是优化的实现)。 但是javax.json.stream.JsonGenerator是一个接口,你使用什么底层实现,是jsonp吗?

java的所有json库都使用某种内部结构,比如map,lists,arrays和/或reflection,以便能够处理json字符串的本质 - 这几乎对它的结构没有任何限制 - 这使得传输数据变得如此强大,但也意味着json处理库本质上需要非常通用,如果某些东西非常普通,那么通常它很慢,因为很难为&#优化它34;未知&#34 ;.从这样的数据构造一个json字符串比仅仅添加字符串要慢,这就是StringBuilder方法如此之快的原因。

没有java-only json lib,这可能比良好的StringBuilder方法更快。

使用带有准备好的数据的byte []数组(比如json消息结构的元素)而不是使用StringBuilder的字符串,你可以更快地使StringBuilder方法更快。所以基本上你可以直接从bytes[]的数组中发送部分json消息,其中包含消息的常量部分,并将数据放入beetween。