Json 已成为当前服务器与 web 应用之间数据传输的公认标准。

微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准。

不过正如许多我们习以为常的事情一样,你会觉得这是理所当然的便不再深入比较。

我们很少会去想用到的这些 Json 库到底有什么不同,但事实上它们的确是不太一样的。

因此,我们团队来对常用的三个 Json 库运行测试,看看在解析不同大小文件时哪个库的速度最快。

在给定的文件大小下,你可以看到不同库之间的解析速度存在着明显的差别。

高吞吐量的情况下,会频繁传输解析小文件,因此一开始的时候可能性能的差距并不明显。

但如果你需要在非常高负载下频繁地解析大量的小文件,差距就开始增大了。

不是所有的 Json 库都叫"特仑苏"。如何根据使用场景才选择正确的库是相当重要的。

1. 选取的开源 Json 库

选择三个个主流的Json 库来进行基准测试:Jackson, Json .simple,GSON

  • 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 的编码。

2. 相对条件下的基准测试

我们同时使用大文件和小文件对这些库进行了基准测试。随着文件大小的不同,处理这些文本所需要的系统资源也会随之上升。

这个基准测试主要关注两个关键场景:

1.大文件下(190MB)的解析速度与小文件(1KB)下的解析速度。大文件取自这里:https://github.com/zeMirco/sf-city-lots-Json

2.小文件是从这里随机生成的:http://www.Json -generator.com/

不管是大文件还是小文件,我们都会用同一个库重复运行10次。

对于每一个大文件,我们都会用同一个库来分别运行10 次。

而对于小文件,在单个库的单次运行中会重复执行10000 次。

在小文件测试的各次迭代中,文件内容都不会驻留在内存里。

大文件结果

Jackson 与 Json .simple 领跑了这轮测试,整体来看 Jackson 又要略优于 Json .simple。

从测试运行的平均结果来看,Jackson 与 Json .simple 在大文件上的表现要优秀。

而 JsonNP 排名第三落后甚远,Gson 更是遥遥垫底。

小文件结果

上表记录的是对每个文件解析10次的平均时间,总的平均时间见下方。各个库在小文件测试中夺冠的次数如下:

  • GSON - 14
  • Json P - 5
  • Jackson -1
  • Json .simple - 0

Gson 这个冠军还是当之无愧的,Json.simple 第二也没什么悬念。Jackson这轮却是垫底了。

尽管 Json.simple 没有在任何文件上夺得第一,但总体来看它的解析速度却是排名第二位的。

还有一个值得注意的是,尽管 Jackson 是这轮最慢的库,但是它在所有文件中的表现都非常一致。

其它三个库虽然偶然会比 Jackson 快很多,但在另一些文件上的解析速度却是旗鼓相当甚至更差。

3. 最后总结

解析速度并非衡量一个Json 库的唯一指标,但它的确非常重要。

通过运行这次基准测试,我们发现没有一个库能在所有文件上击败对手。

大文件中表现优秀的却在小文件上栽了根头,反之亦然。

如果要从解析速度来看选择哪个库的话还得取决于你的使用场景。

  • 如果你的应用经常会处理大的 Json 文件,那么 Jackson 应该是你的菜。Gson 在大文件上表现得相当吃力。
  • 如果你主要是处理小文件请求,比如某个微服务或者分布式架构的初始化,那么 Gson 当是首选。Jackson 在小文件上的表现则不如人意。
  • 如果这两种文件你都经常会处理到,那么在两轮表现中都位居第二的 Json.simple 对此类场景则更为适合。

如果你对 Json 库的解析速度比较敏感的话。

大文件选 Jackson,小文件选GSON,两者则Json .simple。

开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )的更多相关文章

  1. JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

    从http://www.open-open.com/lib/view/open1434377191317.html 转载 Java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WE ...

  2. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...

  3. Java常用的几个Json库,性能强势对比!

    作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...

  4. Json字符串解析原理、超大json对象的解析

    概述 附上完整的代码:https://pan.baidu.com/s/1dEDmGz3(入口类是Json)JSON:JavaScript 对象表示法(JavaScript Object Notatio ...

  5. json系列(三)cjson,rapidjson,yyjson解析性能对比

    前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...

  6. jquery ajax获取json并解析,获取的json是object对象格式

    首先我们使用的是ajax方式,推荐一个学习网址: http://blog.csdn.net/shiyaru1314/article/details/51065410 这个博主写的特别好.现在来看我们的 ...

  7. Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  8. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

  9. Java 下的 JSON库性能比较:JSON.simple

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

随机推荐

  1. 重载hash与isEqual:方法

    重载hash与isEqual:方法 前言 NSObject 自带了hash与isEqual:方法,服务于具有hash表结构的数据结构.NSObject自带的hash函数相当于hash表中的f(key) ...

  2. 使用开源库 Objective-C RegEx Categories 处理正则表达式

    Objective-C RegEx Categories https://github.com/bendytree/Objective-C-RegEx-Categories 使用说明:将 RegExC ...

  3. IOS判断用户的网络类型(2/3/4G、wifi)

    直接贴代码吧,ios7之后是获取的较为准确,7以下我拿iphone5测试的是无法区分3g/2g.连iphone4都能升到7.1.4,而且目前主流的设备7以下的系统已经很少了,这个方案尽管不太完美,但影 ...

  4. 用开源项目CropImage实现图片的裁剪(不推荐)

       之前介绍过一个截图的办法(http://www.cnblogs.com/tianzhijiexian/p/3900241.html),这里再分享个开源项目.它也是截图,但是效果不是很好,首先还是 ...

  5. 拦截器通过Spring获取工厂类,注入bean对象

    // 这里需要注意一点,我们在拦截器内无法通过SpringBean的方式注入LoggerJPA,我只能通过另外一种形式. /** * 根据传入的类型获取spring管理的对应dao * @param ...

  6. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  7. BusinessUnit, User, Role 中常用的APIs

    前段时间为了做项目调研,写了一些测试API的例子.这些API主要涉及这些模块: BusinessUnit, User, Role.把它分享出来,希望对大家的工作有所帮助. APIs No Module ...

  8. 6.2 dubbo在spring中自定义xml标签源码解析

    在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...

  9. xml获取配置DataTable

    在CSDN写博客时,经常遇到需要绑定数据源的时候,可是自己从数据库获取数据的函数都是已经封装好了的,这样别人复制你的代码,要想看到结果,还得修改修改,很是麻烦,博客实例,数据源简单点就好,这样别人写你 ...

  10. Html-文档类型(DTD)和DOCTYPE

    在正式介绍文档类型(DTD)和DOCTYPE之前,我们需要先了解HTML和XHTML的之间的区别,现在Html5已经慢慢的成为主流,之前的数十年一直都是Html4.01的天下,Html4.01于199 ...