内容简介:JSON 已经成为当前服务器与 WEB 应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了。我们很少会去想用到的这些 JSON 库到底有什么不同,但事实上它们的确是不太一样的。因此,我们运行了一个基准测试来对常用的几个 JSON 库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的。下面我会把结果分享给大家。JSON 通常用于传输及解析大文件。这对运行在 Hadoop 或者是 Spark 集群上的数据处理程序而言是个很常见的场景。在给定的文件大小
Java 中哪个 JSON 库的解析速度是最快的?
JSON 已经成为当前服务器与 WEB 应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了。我们很少会去想用到的这些 JSON 库到底有什么不同,但事实上它们的确是不太一样的。因此,我们运行了一个基准测试来对常用的几个 JSON 库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的。下面我会把结果分享给大家。
JSON 通常用于传输及解析大文件。这对运行在 Hadoop 或者是 Spark 集群上的数据处理程序而言是个很常见的场景。在给定的文件大小下,你可以看到不同库之间的解析速度存在着明显的差别。
高吞吐量的情况下,会频繁地传输并解析小文件,因此一开始的时候可能性能的差距并不明显。但如果你需要在非常高负载下频繁地解析大量的小文件,差距就开始增大了。微服务及分布式架构经常会使用 JSON 来传输此类文件,因为这已经是 WEB API 的事实标准。
不是所有的 JSON 库都叫” 特仑苏”。如何根据使用场景才选择正确的库是相当重要的。希望这个基准测试能够对你有所帮助。
JSON 库
JSON.simple vs GSON vs Jackson vs JSONP
我们选择了四个主流的 JSON 库来进行基准测试:JSON.simple, GSON, Jackson 以及 JSONP。在 Java 中进行 JSON 解析通常都会用到这几个库,选择它们的原因是它们在 Github 项目中的亮相频率很高。
下面便是我们所测试的 JSON 库:
- Yidong Fang 的 JSON.simple 。JSON.simple 是一个 JSON 编解码的 Java 工具库。它旨在打造一个轻量简单且高性能的 工具 库。
- Google 的 GSON。GSON 这个 Java 库能够在 Java 对象和 JSON 间进行相互转换。同时它还提供了对 Java 泛型的完整支持,而且还不需要你在类上面添加注解。无需添加注解使用起来则更为便捷,同时在无法修改源代码的情况下这还是一个必要的先决条件。
- FasterXML 的 Jackson 项目。Jackson 是一个数据处理的工具套件,它的亮点是流式的 JSON 解析器及生成器。它是专为 Java 设计的,同时也能处理其它非 JSON 的编码。从我们在 Github 中的统计来看,它应该是最流行的 JSON 解析器。
- Oracle 的 JSONP。JSONP (JSON Processing) 是 JSON 处理的一套 Java API, 从名字来看它就是用来生成及解析 JSON 串的。这是 JSR353 规范的一个开源实现。
基准测试
我们同时使用大文件和小文件对这些库进行了基准测试。随着文件大小的不同,处理这些文本所需要的系统资源也会随之上升。
这个基准测试主要关注两个关键场景:大文件下 (190MB) 的解析速度与小文件(1KB)下的解析速度。大文件取自这里。小文件是从这里随机生成的。
不管是大文件还是小文件,我们都会用同一个库重复运行 10 次。对于每一个大文件,我们都会用同一个库来分别运行 10 次。而对于小文件,在单个库的单次运行中会重复执行 10000 次。在小文件测试的各次迭代中,文件内容都不会驻留在内存里,测试所运行的机器是 AWS 的 c3.large 实例。
大文件的完整测试结果如下,我对小文件的结果求了个平均值。
大文件结果
结果相差甚大!Jackson 与 JSON.simple 领跑了这轮测试,整体来看 Jackson 又要略优于 JSON.simple。从测试运行的平均结果来看,Jackson 与 JSON.simple 在大文件上的表现要优秀一些,而 JSONP 排名第三落后甚远,GSON 更是遥遥垫底。
我们再把结果换算成百分比看下。平均来看 Jackson 要胜出一筹。下面是结果的百分比数据,可以从两个维度来进行比较:
不同库之间的性能差别着实不小。
结论:Jackson 以略微优势胜出。JSON.simple 紧随其后,而剩下两个库则远远落后。
小文件结果
上表记录的是对每个文件解析 10 次的平均时间,总的平均时间见下方。各个库在小文件测试中夺冠的次数如下:
- GSON - 14
- JSONP - 5
- Jackson -1
- JSON.simple - 0
这个结果貌似很有说服力。然而,从所有文件的平均结果来看,GSON 这个冠军还是当之无愧的,JSON.simple 和 JSONP 的二三名之争应该没什么悬念。Jackson 这轮却是垫底了。尽管 JSON.simple 没有在任何文件上夺得第一,但总体来看它的解析速度却是排名第二位的。而 JSONP 尽管在许多文件上都拿到了冠军,但平均来看却只拿到了第三名的成绩。
还有一个值得注意的是,尽管 Jackson 是这轮最慢的库,但是它在所有文件中的表现都非常一致,其它三个库虽然偶然会比 Jackson 快很多,但在另一些文件上的解析速度却是旗鼓相当甚至更差。
我们再把这些数字转换成百分比看看,还是同样的两个维度:
和大文件测试相比,这次的差距相对要小一些,但也还是不容忽视的。
结论:很不幸的是,JSON.simple 又以微弱的劣势与冠军失之交臂,这轮 GSON 胜。JSONP 仍是千年老三而这回 Jackson 则赶了个晚集。
总结
解析速度并非衡量一个 JSON 库的唯一指标,但它的确非常重要。通过运行这次基准测试,我们发现没有一个库能在所有文件上击败对手。大文件中表现优秀的却在小文件上栽了根头,反之亦然。
- 如果要从解析速度来看选择哪个库的话还得取决于你的使用场景。
- 如果你的应用经常会处理大的 JSON 文件,那么 Jackson 应该是你的菜。GSON 在大文件上表现得相当吃力。
- 如果你主要是处理小文件请求,比如某个微服务或者分布式架构的初始化,那么 GSON 当是首选。Jackson 在小文件上的表现则不如人意。
- 如果这两种文件你都经常会处理到,那么在两轮表现中都位居第二的 JSON.simple 对此类场景则更为适合。在不同的文件大小上 Jackson 和 GSON 的表现都不太好。
除非不考虑解析速度,不然 JSONP 完全没有什么值得称道的。它在大文件和小文件上的表现与其它库相比都很糟糕。所幸的是,Java 9 很快便会有原生的 JSON 实现了,相信 JSONP 将来的表现仍然值得期待。
终于讲完了。如果你对 JSON 库的解析速度比较敏感的话,大文件选 Jackson,小文件选 GSON,两者则 JSON.simple。如果你对这次的基准测试有什么疑问请在下方留言.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 无服务平台性能比较
- 几种OpenJDK的JVM性能比较
- Scala 中的集合(二):集合性能比较
- Scala 中的集合(二):集合性能比较
- 重定向的九种方案及性能比较
- JEE与Spring Boot代码性能比较
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RESTful Web Services Cookbook
Subbu Allamaraju / Yahoo Press / 2010-3-11 / USD 39.99
While the REST design philosophy has captured the imagination of web and enterprise developers alike, using this approach to develop real web services is no picnic. This cookbook includes more than 10......一起来看看 《RESTful Web Services Cookbook》 这本书的介绍吧!