Fastjson与Jackson性能问题

原创 吴就业 138 0 2019-11-08

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/b5cbe89a447645439e0a96c0351c02fc

作者:吴就业
链接:https://wujiuye.com/article/b5cbe89a447645439e0a96c0351c02fc
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

话说在前面,本篇并不会去比较fastjson与Jackson在正常业务场景下的json解析性能,侧重点是比较两者在解析大json字符串上的性能。可以给出的结论是,jackson在解析大json场景下性能是秒杀fastjson的,不急,我们有图有真相。

我对大Json的定义是,超过1m大小的json字符串可以算是大json了。可能大家平时都没有遇到超过1m大小的json字符串,最多也就几百kb级别的,而这个级别json,fastjson与jackson解析性能比较可以参考网上的一些分析文章。

我遇到的大Json解析场景,来自第三方接口的调用。最大的有64m的json字符串,这是输出到文本文件后以文件的大小计算的。有些第三方接口没有分页的功能,我遇到一次一个接口调用返回几百万条数据的,也是从那次开始,发现fastjson的弊端。

之前测试过一次,64m的json用fastjson解析花了一个多小时,,这种场景下,fastjson不再fast。而今天我再测试一次一个只有2000条记录的json字符串解析,分别用fastjson与jackson解析,比较两者的性能。

图片

从测试代码中可以看出,这是一个调用第三方接口,拿到响应body之后,再分别使用fastjson与jackson测试解析耗时的例子。

方法输出:

图片

可以看到,jackson解析耗时只需要318毫秒,而fastjson却要641459毫秒,这差的不是一星半点,整整2017倍。而且json字符串越长,性能差异越大,大家可以亲自去测试一下,模拟一个超过1m大小的字符串,分别使用fastjson与jackson测试。

Fastjson其实也给出了针对这种大json解析场景的解决方案,stream api,但并不能解决大部分的业务场景。感兴趣可以去研究下。

你可能想通过缩短Json字符串解决这个问题,确实也是,谁会这么无聊,设置响应如此大数据量的接口,简直就是数据库拷贝。这确实可以通过接口支持分页解决,但你没办法让别人去改变这种设计,接口是别人家的,人家改不改是别人家的事情,我们能做的只有自己去优化。

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Dubbo自适应随机负载均衡策略的实现

Dubbo默认使用随机负载均衡策略,据笔者了解,目前Dubbo一共提供了四种可选的负载均衡策略,有关于负载均衡策略的实现,如果不怕阅读源码枯燥的,笔者推荐阅读官网的源码导读部份的文档。

源码分析Dubbo负载均衡策略的权重如何动态修改

dubbo随机负载均衡的权重很少会用到吗?之前我想给随机负载均衡策略配置权重,各种搜索都找不到答案,包括翻阅官方文档。而且我们项目中用的还是最新的Nacos注册中心,非常无奈,最后只能在源码中寻找答案。

深入理解Dubbo源码,Dubbo与Spring的整合之注解方式分析

dubbo通过BeanFactoryPostProcessor与BeanPostProcessor分别完成ServiceBean的注册与被@Reference注释的属性的依赖注入,通过BeanPostProcessor完成配置文件与相关配置类bean的属性绑定。

ES与Redis实现千万级数据的范围查询性能比较,远程 http调用耗时也能降低到0ms

本篇介绍使用ES与使用Redis实现的IP库范围查询谁性能更强,以及远程http调用ip服务耗时如何降低到0ms。

基于Redis实现范围查询的IP库缓存设计方案

IP信息库是按区间存储的,拿到一个ip得要知道它所属的范围才能知道它对应哪条记录。本篇介绍如何使用Redis的Sorted Set数据结构实现支持范围查找的IP库缓存方案。

网络编程中,关于Keep-Alive与Idle你了解多少?

有朋友问我,关于使用Netty开发长连接应用,为什么要加一个Keep Alive为true的配置。你是否也有这样的疑惑呢?