像JSON一样使用ProtoBuf,空间还能缩小60%,性能提升100%

news2024/11/15 20:47:16

首发公众号:【赵侠客】

引言

在前面《释放你九成的带宽和内存:GZIP在解决Redis大Key方面的应用》一文中我使用GZIP算法可以将JSON格式数据的大小缩小88%从而节省了大量的存储和带宽资源,本文介绍另一种JAVA对象序列化神器——ProtoBuf(Protocol Buffers(),它是由 Google 开发的一种用于序列化结构化数据的高效、灵活且语言中立的协议。它被广泛用于数据通信、数据存储、RPC(远程过程调用)等场景,特别是在分布式系统和微服务架构中。Protobuf 序列化后的数据体积通常比 JSON、XML 小很多,而且占用更少的带宽和存储空间,且解析速度更快。但是相对于 JSON、XML 等文本格式可读性差,使用比较麻烦,最主要是增加了开发和编译的步骤(需要使用 protoc 编译 .proto 文件),本文介绍JProtoBuf神器,像使用JSON一样使用Protobuf。

二、Quick Start

JProtobuf 是一个基于Java的Protobuf序列化与反序列化工具,它由百度开发并开源的,旨在简化 Protobuf 在 Java 项目中的使用门槛。JProtobuf提供了一种更符合Java开发者习惯的方式来定义和操作Protobuf数据,无需使用.proto 文件和编译工具,项目GitHub地址:

JProtobuf:https://github.com/jhunters/jprotobuf

使用JProtobuf只需要三步就能完成JAVA对象和Protobuf数据之间的相互转换:

  • 第一步,添加Maven依赖:
<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>jprotobuf</artifactId>
    <version>2.4.23</version>
</dependency>
  • 第二步,对象添加@ProtobufClass注解
@Data
@ProtobufClass
public class User {
    private Long id;
    private String name;
    private String trueName;
    private Integer age;
    private String sex;
    private Date createTime;
}

- 第三步,创建ProtobufProxy创建代理并使用

User user = new User();
user.setId(1L);
user.setName("赵侠客");
user.setAge(29);
user.setSex("男");
user.setTrueName("公众号");
user.setCreateTime(new Date());
//创建JProtobuf代理
Codec<User> codec = ProtobufProxy.create(User.class);
//使用Protobuf序列化
byte[] bytes = codec.encode(user);
System.out.println(bytes.length); //38
//使用Protobuf反序列化
User user1 = codec.decode(bytes);

通过上面的代码可以看出使用JProtobuf来完成对象的序列化和使用JSON序列化对象是一样的简单,其中Protobuf序列化后的字节长度是38,JSON的字节长度为98,足足节省了61%。当然并不是所有对象使用Protobuf后大小和JSON都会有这么大的差距,接下来我们对比一下中JSON大JSON序列化后大小差距。

三、大小对比

3.1 中JSON大小对比

这里我们参考前面一文《FastJson、Jackson、Gson、Hutool,JSON解析哪家强?JMH基准测试来排行》对 小JSON中JSON大JSON的定义。这里我定义中JSON为20个用户数组,由于JProtobuf不能直接支持List对象,所以要封装成一个Users对像:

@Data
@ProtobufClass
public class Users {
    List<User> users;
    private Long id;
}

使用上面的20个小JSON创建出一个中JSON:

//20个用户模拟中JSON
List<User> userList = new ArrayList<>();
IntStream.range(0, 20).forEach(i -> {
    User user2=new User();
    BeanUtil.copyProperties(user,user2);
    userList.add(user2);
});
users.setUsers(userList);

使用JProtobuf序列化中JSON:

Codec<Users> userListCodec = ProtobufProxy.create(Users.class);
String mediumJson = JSON.toJSONString(users);
byte[] mediumProtobuf = userListCodec.encode(users);
mediumJson.getBytes().length+"\t"+mediumProtobuf.length;
//1991	800

中JSON方面Protobuf序列化后的长度为800,JSON序列化后的长度为1991,Protobuf比JSON小了60%

3.2 大JSON大小对比

大JSON我们定义为稿件正文富文本HTMl数据:

@Data
@ProtobufClass
public class Article {
    private Long id;
    private String author;
    private Long tenantId;
    private String title;
    private String subTitle;
    private String htmlContent;
    private Date publishTime;
}

Mock大JSON数据:

//稿件正文模拟大JSON
article.setId(10000L);
article.setTenantId(10000L);
article.setAuthor("公众号:赵侠客");
article.setPublishTime(new Date());
article.setTitle(RandomUtil.randomString("主标题", 100));
article.setSubTitle(RandomUtil.randomString("副标题", 50));
//公众号文章字符串长度为89544
article.setHtmlContent(new String(Files.readAllBytes(Paths.get("article.html"))));

使用JProtobuf序列化大JSON:

Codec<Article> articleCodec = ProtobufProxy.create(Article.class);
String bigJson = JSON.toJSONString(article);
byte[] bigProtobuf= articleCodec.encode(article);
bigJson.getBytes().length+"\t"+bigProtobuf.length;
//94595	92826

对于大JSON使用Protobuf只比JSON小了2%,可能是大数据量JSON格式中的冗余信息占总信息大小非常小了,所以大数据量转成JSON和Protobuf差距也就不大了。

四、性能对比

性能对比我们参考前面一文《FastJson、Jackson、Gson、Hutool,JSON解析哪家强?JMH基准测试来排行》,为了准确我们使用JMH基准测试,还是从小JSON中JSON大JSON的序列化和反序列化6项指标做基准测试,我们就拿性能最炸裂了FastJson2和Protobuf对比。

百分制:我们以FastJson2跑分为100分做参考,比FastJson2快就大于100分

其中缩写定义:

  • SS,小JSON序列化得分
  • MS,中JSON序列化得分
  • BS,大JSON序列化得分
  • SDS,小JSON反序列化得分
  • MDS,中JSON反序列化得分
  • BDS,大JSON反序列化得分
  • 变化,相对序列化得分变化

4.1 小JSON序列化

ToolScore百分制
FastJson213561505100
Protobuf1285853294.8

可以看出Protobuf小对象序列化性能可以媲美FastJson2,是非常快的。

4.12 中JSON序列化

ToolScore百分制
FastJson2825644100
Protobuf43663552.9

可以看出Protobuf数组对象序列化性能是FastJson2的一半,可能和JProtobuf不直接支持List对象有点关系,所以性能并没有那么的出众。

4.3 大JSON序列化

ToolScore百分制
FastJson210086100
Protobuf21764215.8

可以看出Protobuf大对象序列化性能比FastJson2快了一倍多,这性能是JSON工具望成莫及的。

4.4 小JSON反序列化

Tool百分制变化SDSSS
FastJson2100-41.7%792106913561505
Protobuf185.3+14.1%1467671212858532

小对象的反序列化Protobuf比FastJson2快了近一倍达到185.3,而且性能比序列化还要好14.1%,不像FastJson2反序列化比序列化性能低了41.7%,这性能是非常炸裂的。

4.5 中JSON反序列化

Tool百分制变化MDSMS
FastJson2100-53.3%385392825644
Protobuf79.4-29.9%306087436635

数组对象反序列化和序列化一样,性能没有那么的出众,感觉数组对象序列化和反序列化是Protobuf的弱点

4.6 大JSON反序列化

Tool百分制变化BDSBS
FastJson2100-35.7%648710086
Protobuf480.4+43.2%3116321764

大对象反序列化性能是FastJson2的近5倍达到惊人的480.4,可能不是Protobuf反序列化性能太强,而是JSON这种数据结构就不太适合大数据量的转换。

总结

空间

Protobuf空间比JSON变化:

对象相比JSON
小JSON-61%
中JSON-60%
大JSON-2%

时间

Protobuf对比JSON工具性能排行榜:

Tool排名总分百分制SSMSBSSDSMDSBDS
Protobuf王者1108.6195.594.852.9215.8185.379.4480.4
FastJson2状元56710010010072.010010095.0
FastJson榜眼394.269.562.373.235.851.371.6100
Jackson探花34260.342.389.710027.431.351.3
Gson进士188.233.28.921.543.620.725.368.2
Hutool孙山42.27.43.24.67.77.35.513.9

ProtoBuf VS FastJson2 雷达图

结论

经过上面测试可以得出Protobuf以下结论:

  • 在小数据情况下序列化空间比JSON大幅缩小,本文测试达到60%左右
  • 在大数据情况下序列化空间和JSON相差无几
  • 在小数据序列化性能媲美FastJson2
  • 劣势是在数组序列化和反序列化性能都比FastJson2低很多
  • 在大数据序列化和反序列化性能都秒杀所有JSON

综合在Protobuf序列化后的空间缩小和性能方面还是比JSON强的,所以如果在RPC中将序列化和反序列化从JSON改成Protobuf会给系统带来一定程度的性能提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打破服务提供商的数据中心自动化障碍

在通信服务提供商&#xff08;CSP&#xff09;不断变革的背景下&#xff0c;数据中心发挥着越来越重要的作用。这些数据中心不仅是部署基于云的5G基础设施的重要组成部分&#xff0c;还在促进边缘计算和下一代企业解决方案的过程中发挥着关键作用。然而&#xff0c;随着数据中心…

YOLOv10改进系列,YOLOv10损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点

改进前训练结果: 改进后的结果: 摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针…

PyCharm安装和使用教程(Windows系统)

一、pycharm基本使用 说明&#xff1a; PyCharm 是一款功能强大的 Python 编辑器&#xff0c; 本文简单的介绍下PyCharm 在 Windows下是如何安装的。 PyCharm 的下载地址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows 如果进入网页时间过长或进不…

OpenAI震撼发布o1大模型!RL深度思考,技术差距拉开

openai放大招了&#xff0c;是奥特曼在推上宣传了很久的草莓真身&#xff0c;这次它真的来了。 又给大家带来一点小小的震撼&#xff0c;国内大模型老板们也不再迷茫了&#xff0c;4o的多模态的还没赶上呢&#xff0c;这下怎么又回到纯文本了&#xff0c;不是说大家都搞得差不多…

神经网络通俗理解学习笔记(1)

神经网络通俗理解学习笔记&#xff08;1&#xff09; 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…

性能测试的五大目标

性能测试的目的其实是为了验证软件系统是否能够达到用户的性能指标&#xff0c;发现软件系统中存在的性能瓶颈&#xff0c;随后优化软件&#xff0c;最后起到优化系统的目的。 主要有以下几点&#xff1a; 评估系统的能力 测试中得到的负荷和响应时间数据可以被用于验证所计…

AI+智能监控实训平台

基本介绍 中智讯“AI智能监控实训平台” &#xff08;AI-Monitor&#xff09;是中智讯公司面向于人工智能等相关专业设计的一款工程实训平台&#xff0c;该产品基于基于行业内主流的TensorFlow深度学习框架来实现&#xff0c;同时&#xff0c;通过机器视觉技术和边缘计算技术实…

【新手上路】衡石分析平台使用手册-系统管理员手册

用户管理​ 用户管理页面可以创建管理用户、对用户进行分组管理、组织架构管理及用户属性的维护和管理。下面详细介绍用户管理相关功能。 用户管理​ 用户管理子页面展示了当前系统中所有用户的信息&#xff0c;可以添加新用户&#xff0c;查看、编辑已有用户&#xff0c;可…

C++设计模式(更新中)

文章目录 1、创建型模式1.1 简单工厂&#xff08;Simple Factory&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.2 工厂方法&#xff08;Factory Method&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.3 抽象工厂&…

【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧

文章目录 Python NumPy学习指南第一部分&#xff1a;NumPy简介与安装1. 什么是NumPy&#xff1f;2. 安装NumPy使用pip安装&#xff1a;使用Anaconda安装&#xff1a; 第二部分&#xff1a;NumPy数组基础1. NumPy数组的创建从列表创建一维数组&#xff1a;创建多维数组&#xff…

发现了一个很神奇很哇塞的做事心态,就2个字

最近发现了一个很神奇很哇塞的做事心态&#xff0c;轻松收获了很多意向不到的结果&#xff0c;其实就两个字&#xff0c;会玩。 大家有没有发现&#xff0c;很多时候越是重要的地方&#xff0c;我们就会越用力&#xff0c;越用力的时候&#xff0c;反而结果却差强人意。越在意我…

IDC 2024未来企业大奖:酷克数据携手中国联通打造湖仓一体平台

9月11日-12日&#xff0c;2024 IDC中国年度峰会暨颁奖典礼于上海圆满召开。全球权威IT市场研究和咨询公司IDC公布了 2024 未来企业大奖的优秀奖名单。中国联通与酷克数据联合申报的《中国联通筑梦数字化转型&#xff1a;自主可控、开放协作的混合受管理湖仓一体平台》项目&…

Hi3516DV500 高清智慧视觉 SoC

1.1 概述 Hi3516DV500 是一颗面向视觉行业推出的高清智能 Soc 。该芯片最高支持 2 路 sensor 输入&#xff0c;支持最高 5M30fps 的 ISP 图像处理能力&#xff0c;支持 2F WDR 、多级降噪、六轴防 抖、多光谱融合等多种传统图像增强和处理算法&#xff0c;支持通…

企语iFair-协同管理系统-任意文件读取

文章目录 免责申明漏洞描述搜索语法漏洞复现yaml修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 企语iFair协同管理系统getuploadimage.jsp接口处存在任意文件读取漏洞…

发现抖音趋势与打造病毒内容的17种方法

无论是喜欢还是不喜欢&#xff0c;社交媒体总是关于什么是“流行”和受欢迎的。因此&#xff0c;毫不奇怪&#xff0c;随着TikTok的发展&#xff0c;TikTok的趋势也在不断增加。 TikTok趋势是指TikTok视频中具有吸引大量观众的特征。TikTok趋势通常始于一些通过尝试创意格式或…

算法知识点———并查集

并查集是一种用于管理元素所属集合的数据结构&#xff0c;实现为一个森林&#xff0c;其中每棵树表示一个集合&#xff0c;树中的节点表示对应集合中的元素。并查集支持两种操作&#xff1a; 合并&#xff08;Union&#xff09;&#xff1a;合并两个元素所属集合&#xff08;合…

第J4周:ResNet与DenseNet结合--DPN(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc;本周任务&#xff1a;&#x1f4cc; ● 任务类型&#xff1a;自主探索⭐⭐ ● 任务难度&#xff1a;偏难 ●任务描…

nodejs 010:Webpack 可视化分析插件 webpack-bundle-analyzer的使用

安装 yarn add --dev webpack-bundle-analyzer 原始webpack.config.js 代码定义了 Webpack 的配置&#xff0c;主要任务是将 JavaScript 和 CSS 文件打包&#xff0c;并将 CSS 提取到单独的文件中&#xff0c;配置了对 Electron 应用的支持&#xff0c;同时还将 React 相关的…

Blue Screen of Death(BSOD)

Blue Screen of Death&#xff08;BSOD&#xff09;蓝屏 进来就是蓝屏。。。 按【电源】开关&#xff0c;连续三次 然后非常非常慢&#xff0c;启动了十几分钟 svchost (30028,R,98) TILEREPOSITORYS-1-5-18: 打开日志文件 C:\WINDOWS\system32\config\systemprofile\AppData…

6、定义字段状态变式

定义解释 字段状态变式是分配给公司代码的一项重要参数,在字段状态变式中罗列了很多字段状态组,而字段状态组是会计科目中的一个重要参数.它控制在输入一张会计记帐凭证时,该科目的那些辅助核算项目是必须输入的,哪些是不允许输入的,哪些是可以选择的 重点&#xff1a;科目组…