Java 中哪个 JSON 库的解析速度是最快的?

这个问题有意义吗?各个JSON库的性能差距不大?呵呵,差距大不大,自己往下看吧!

这个问题我们应该分为以下四个维度进行研究:

1.序列化

2.反序列化

3.大数据量

4.小数据量

每个库都会有一些优化的方法,在此我们不做任何优化设置,直接上干货:序列化执行后的结果图:

从上面的测试结果可以看出,序列化次数比较小的时候,Gson性能最好,当不断增加的时候到了100000,Gson明细弱于Jackson和FastJson, 这时候FastJson性能是真的牛,另外还可以看到不管数量少还是多,Jackson一直表现优异。

这是我从别人的测试中参考的,看了作者的代码,每个json的数据量应该不大,应在1K以内。而且gson的处理时间有点线性增长的意思,FastJson和Jackson在这方面有相应优化,这里给赞一个。

下面来一个反序列化的,执行后的结果图:

从上面的测试结果可以看出,反序列化的时候,Gson、Jackson和FastJson区别不大,性能都很优异,而那个Json-lib还是来继续搞笑的。

再看一下另外一个人的测试结果:

大文件下 (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库的使用研究(二)的更多相关文章

  1. JSON库的使用研究(三)

    怎么选择JSON库? 从整体测试结果来看,总结如下: 用于序列化.反序列的功能,数量量小,吞吐量不大于10000每秒的,选择gson: 用于解析JSON的,还是用Fastjson吧,虽然听说坑很多. ...

  2. JSON库的使用研究(一)

    最近用到JSON,收集了一些资料,整理如下: 选择一个合适的JSON库要从多个方面进行考虑: 字符串解析成JSON性能 字符串解析成Java Object性能 Java Object转JSON性能 集 ...

  3. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  4. C++的开源跨平台日志库glog学习研究(三)--杂项

    在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...

  5. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  6. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  7. Fiddler实战深入研究(二)

    Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...

  8. (转载)Fiddler实战深入研究(二)

    原文来源于:http://www.cnblogs.com/tugenhua0707/p/4637771.html,作者:涂根华 !个人觉得文章写的特别好,故收藏于此,感谢原作者的分享 Fiddler实 ...

  9. json库的编译方法和vs2010中导入第三方库的方法

    json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/  ...

随机推荐

  1. WebDriver中的操作使用

    1.WebDriver中使用jquery假如设定jquery包的路径为path,则程序如下: String jquery=null; FileInputStream input = new FileI ...

  2. Python建立时间事件引擎原理剖析

    作为python小白,学习量化交易的曲线是非常陡峭的,唯一好的办法就是一点点啃代码.以下代码案例来自vnpy的引擎代码. # encoding: UTF-8 #定义时间事件 EVENT_TIMER = ...

  3. 【Linux】vim的使用

    使用vi和vim的原因:linux很多软件默认调用vi进行编辑,因此有必要熟悉它的使用规则 vi: 打开文件: vi 文件名 [一般模式]打开文件时进入一般模式,这个模式下的操作: 上下左右移动光标 ...

  4. API setContentType(MIME) 参数说明

    HttpServletResponse的setContentType(MIME) API主要用以告诉浏览器服务器所传递的数据类型或服务器希望浏览器以何种方式解析和展示这些数据 其由两部分构成,如:te ...

  5. 前端面试题---vue部分

    1.vue的两大核心思想 组件化和数据驱动 2.如何理解vue中的MVVM模式 Model-View-ViewModel(简称为mvvm)是一种设计思想,model层代表数据模型,也可以再model中 ...

  6. app微信支付-java服务端接口 支付-查询-退款

    个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...

  7. 别人的Linux私房菜(22)软件安装:源代码与Tarball

    执行make,会在当前目录查找makefile文本文件(记录了源代码如何编译的详细信息). 内核相关的函数信息放置在/usr/lib./usr/lib64里. 在Tarball(一般为xxx.tar. ...

  8. Python19/1/11--标签与过滤器/Django模块导入继承/静态文件配置

      1 模板语言之变量: -{{ }} 相当于执行了print -深度查询 . 如果是方法,不能加括号,不能传参数2 过滤器 {{ 变量|过滤器的名字:'参数' }} -add -default -s ...

  9. (23)The surprising connection between brain injuries and crime

    https://www.ted.com/talks/kim_gorgens_the_surprising_connection_between_brain_injuries_and_crime/tra ...

  10. \usepackage{ulem}带下划线的问题解决

    其实正文应该是斜体字的,但是有可能默认模板会导致斜体变下划线的问题,解决方法如下: \usepackage{ulem} 在 \documentclass[format=acmsmall, review ...