个人我的德州扑克项目https://github.com/mingzijian/pokers,欢迎给星星。
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多咱们所习觉得常的事情同样,你会以为这是理所固然的便再也不深刻思考 了。咱们不多会去想用到的这些JSON库到底有什么不一样,但事实上它们的确是不太同样的。所以,咱们运行了一个基准测试来对经常使用的几个JSON库进行了测 试,看看在解析不一样大小的文件时哪一个库的速度是最快的。下面我会把结果分享给你们。html
JSON一般用于传输及解析大文件。这对运行在Hadoop或者是Spark集群上的数据处理程序而言是个很常见的场景。在给定的文件大小下,你能够看到不一样库之间的解析速度存在着明显的差异。java
高吞吐量的状况下,会频繁地传输并解析小文件,所以一开始的时候可能性能的差距并不明显。但若是你须要在很是高负载下频繁地解析大量的小文件,差距就开始增大了。微服务及分布式架构常常会使用JSON来传输此类文件,由于这已是WEB API的事实标准。git
不是全部的JSON库都叫"特仑苏"。如何根据使用场景才选择正确的库是至关重要的。但愿这个基准测试可以对你有所帮助。github
咱们选择了四个主流的JSON库来进行基准测试:JSON.simple, GSON, Jackson以及JSONP。在Java中进行JSON解析一般都会用到这几个库,选择它们的缘由是它们在Github项目中的亮相频率很高。json
下面即是咱们所测试的JSON库:服务器
Yidong Fang的JSON.simple(https://github.com/fangyidong/json-simple)。JSON.simple是一个JSON编解码的Java工具库。它旨在打造一个轻量简单且高性能的工具库。架构
Google的GSON(https://github.com/google/gson)。GSON这个Java库可以在Java对象和JSON间进行相互转换。同时它还提供了对Java泛型的完整支持,并且还不须要你在类上面添加注解。无需添加注解使用起来则更为便捷,同时在没法修改源代码的状况下这仍是一个必要的先决条件。分布式
FasterXML的Jackson项目(https://github.com/FasterXML/jackson)。Jackson是一个数据处理的工具套件,它的亮点是流式的JSON解析器及生成器。它是专为Java设计的,同时也能处理其它非JSON的编码。从咱们在Github中的统计来看,它应该是最流行的JSON解析器。微服务
Oracle的JSONP(https://jsonp.java.net/)。JSONP (JSON Processing)是JSON处理的一套Java API,从名字来看它就是用来生成及解析JSON串的。这是JSR353规范的一个开源实现。工具
咱们同时使用大文件和小文件对这些库进行了基准测试。随着文件大小的不一样,处理这些文本所须要的系统资源也会随之上升。
这个基准测试主要关注两个关键场景:大文件下(190MB)的解析速度与小文件(1KB)下的解析速度。大文件取自这里:https://github.com/zeMirco/sf-city-lots-json。小文件是从这里随机生成的:http://www.json-generator.com/。
不论是大文件仍是小文件,咱们都会用同一个库重复运行10次。对于每个大文件,咱们都会用同一个库来分别运行10次。而对于小文件,在单个库的单 次运行中会重复执行10000次。在小文件测试的各次迭代中,文件内容都不会驻留在内存里,测试所运行的机器是AWS的c3.large实例。
大文件的完整测试结果以下,我对小文件的结果求了个平均值。想要看完整的结果,请移步这里。若是想看小文件测试的源码,请从这里下载。
结果相差甚大!Jackson与JSON.simple领跑了这轮测试,总体来看Jackson又要略优于JSON.simple。从测试运行的平 均结果来看,Jackson与JSON.simple在大文件上的表现要优秀一些,而JSONP排名第三落后甚远,GSON更是遥遥垫底。
咱们再把结果换算成百分比看下。平均来看Jackson要胜出一筹。下面是结果的百分比数据,能够从两个维度来进行比较:
不一样库之间的性能差异着实不小。
结论:Jackson以略微优点胜出。JSON.simple紧随其后,而剩下两个库则远远落后。
上表记录的是对每一个文件解析10次的平均时间,总的平均时间见下方。各个库在小文件测试中夺冠的次数以下:
这个结果貌似颇有说服力。然而,从全部文件的平均结果来看,GSON这个冠军仍是当之无愧的,JSON.simple和JSONP的二三名之争应该 没什么悬念。Jackson这轮倒是垫底了。尽管JSON.simple没有在任何文件上夺得第一,但整体来看它的解析速度倒是排名第二位的。而 JSONP尽管在许多文件上都拿到了冠军,但平均来看却只拿到了第三名的成绩。
还有一个值得注意的是,尽管Jackson是这轮最慢的库,可是它在全部文件中的表现都很是一致,其它三个库虽然偶然会比Jackson快不少,但在另外一些文件上的解析速度倒是旗鼓至关甚至更差。
咱们再把这些数字转换成百分比看看,仍是一样的两个维度:
和大文件测试相比,此次的差距相对要小一些,但也仍是不容忽视的。
结论:很不幸的是,JSON.simple又以微弱的劣势与冠军失之交臂,这轮GSON胜。JSONP还是千年老三而这回Jackson则赶了个晚集。
解析速度并不是衡量一个JSON库的惟一指标,但它的确很是重要。经过运行此次基准测试,咱们发现没有一个库能在全部文件上击败对手。大文件中表现优秀的却在小文件上栽了根头,反之亦然。
若是要从解析速度来看选择哪一个库的话还得取决于你的使用场景。
除非不考虑解析速度,否则JSONP彻底没有什么值得称道的。它在大文件和小文件上的表现与其它库相比都很糟糕。所幸的是,Java 9很快便会有原生的JSON实现了,相信JSONP未来的表现仍然值得期待。
终于讲完了。若是你对JSON库的解析速度比较敏感的话,大文件选Jackson,小文件选GSON,二者则JSON.simple。若是你对此次的基准测试有什么疑问请在下方留言。
来自:http://it.deepinmind.com/java/2015/06/15/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json.html