Go语言常见序列化协议全面对比

先说结论

从易用性、性能、内存占用、编码后大小等几个方面综合考虑 ProtoBuf 胜出。
Gob 从性能和 I/O 带宽占用上都和 ProtoBuf 差不多,唯一劣势是编解码时内存占用较多。考虑到不用再写 IDL 带来的易用性,如果整个系统内不存在使用除 Go 以外其他语言的服务,Gob 是更合适的选择。

jsonmsgpgobpbflatbuffers
易用性一般极差
性能
编解码内存占用一般
编码后大小
成熟度一般较好一般

测试场景

限制单核单线程场景,使用本地机器进行测试。
使用对象为 10 个字段对象,包括 string、int32、slice、map 等多种类型,且存在嵌套关系。

type Layer10 struct {IntField    int32StringField stringSliceField  []int32MapField    map[string]int32Field5      int32Field6      stringField7      []int32Field8      map[string]int32Field9      int32Field10     stringLayer10 *Layer10
}

主要验证 json、gob、msgp、pb、flatbuffers 这 5 种序列化方案。

场景1:层数逐渐增长

性能

这里不对CPU利用率做分析,原因是编解码属于纯计算密集型场景,每一种序列化方式都能跑满CPU。我们应该关注同等CPU性能下,序列化的效率。下面分别测试编解码混合、仅编码和仅解码的效率。
编解码混合
设定层级数从1层到100层递增,使用5种序列化方式进行编码+解码。
image.png
可以看出,在对象简单时(嵌套层级不超过5层),gob的性能不是很好,甚至比json更差;但在对象复杂度很高时,gob的性能优势就体现出来。
pb的性能略好于gob,二者的增长斜率基本一致。在应对复杂对象场景时,GOB性能要比JSON好一倍以上。
性能排名(>表示优于):FLAT > PB > GOB > MSGP > JSON

仅编码
image.png
JSON 的编码效率并不低,甚至能和 GOB 和 PB 保持在同一水平线上。

仅解码
image.png
解码效率拉开差距,JSON 解码性能很差,GOB 和 PB 较好,GOB 略低于 PB。

内存使用率

image.png
在序列化过程中,gob 需要消耗较多内存。而 pb 一直保持较低内存消耗
内存使用排序(>表示优于):PB > JSON > FLAT > MSGP >GOB

编码后大小

image.png
编码后,pb 和 gob 的长度都较小,基本不分伯仲。其他三种表现一般。
编码后大小排序(>表示优于):GOB > PB > FLAT > MSGP > JSON

以下是不同数量级时的性能表现:

# 层级为1时
Layer-1-Size-1-JSON         	    1000	      3887 ns/op	    1384 B/op	      34 allocs/op
Layer-1-Size-1-GOB          	    1000	     23707 ns/op	   13270 B/op	     333 allocs/op
Layer-1-Size-1-PB           	    1000	      1594 ns/op	    1000 B/op	      30 allocs/op
Layer-1-Size-1-MSGP         	    1000	      4139 ns/op	    2040 B/op	      59 allocs/op
Layer-1-Size-1-FLAT         	    1000	     6.708 ns/op	       1 B/op	       0 allocs/op# 层级为10时
Layer-10-Size-1-JSON        	    1000	     39244 ns/op	   11592 B/op	     256 allocs/op
Layer-10-Size-1-GOB         	    1000	     40830 ns/op	   27202 B/op	     623 allocs/op
Layer-10-Size-1-PB          	    1000	     17232 ns/op	    9280 B/op	     264 allocs/op
Layer-10-Size-1-MSGP        	    1000	     32549 ns/op	   15208 B/op	     431 allocs/op
Layer-10-Size-1-FLAT        	    1000	     20.79 ns/op	      13 B/op	       0 allocs/op# 层级为100时
Layer-100-Size-1-JSON       	    1000	    351715 ns/op	  111428 B/op	    2422 allocs/op
Layer-100-Size-1-GOB        	    1000	    183746 ns/op	  172531 B/op	    3509 allocs/op
Layer-100-Size-1-PB         	    1000	    162784 ns/op	   92208 B/op	    2604 allocs/op
Layer-100-Size-1-MSGP       	    1000	    315320 ns/op	  172416 B/op	    4125 allocs/op
Layer-100-Size-1-FLAT       	    1000	     88.75 ns/op	     120 B/op	       1 allocs/op

场景2:切片长度逐渐增长

设定一个[]Layer10,Layer10 只有一层,不做嵌套。切片中对象的数量逐渐增长

性能

image.png
与层级增长的情况一致,在对象简单时(列表长度不超过 15 个时),gob 的性能不是很好,甚至比 json 更差;但在对象复杂度很高时,gob 的性能优势才能体现出来。
性能排名:FLAT > PB > GOB > MSGP > JSON

内存使用率

image.png
结论同场景 1 一致

编码后大小

image.png
结论同场景 1 一致
不同数量级时的性能表现:

# 层级为1时
Layer-1-Size-1-JSON         	    1000	      3903 ns/op	    1384 B/op	      34 allocs/op
Layer-1-Size-1-GOB          	    1000	     23681 ns/op	   13267 B/op	     333 allocs/op
Layer-1-Size-1-PB           	    1000	      1614 ns/op	    1000 B/op	      30 allocs/op
Layer-1-Size-1-MSGP         	    1000	      4010 ns/op	    2040 B/op	      59 allocs/op
Layer-1-Size-1-FLAT         	    1000	     7.458 ns/op	       1 B/op	       0 allocs/op# 层级为10时
Layer-1-Size-10-JSON        	    1000	     37965 ns/op	   11592 B/op	     256 allocs/op
Layer-1-Size-10-GOB         	    1000	     40962 ns/op	   27205 B/op	     623 allocs/op
Layer-1-Size-10-PB          	    1000	     16340 ns/op	    9280 B/op	     264 allocs/op
Layer-1-Size-10-MSGP        	    1000	     31643 ns/op	   15208 B/op	     431 allocs/op
Layer-1-Size-10-FLAT        	    1000	     14.50 ns/op	      13 B/op	       0 allocs/op# 层级为100时
Layer-1-Size-100-JSON       	    1000	    388890 ns/op	  111420 B/op	    2422 allocs/op
Layer-1-Size-100-GOB        	    1000	    190858 ns/op	  172533 B/op	    3509 allocs/op
Layer-1-Size-100-PB         	    1000	    166676 ns/op	   92208 B/op	    2604 allocs/op
Layer-1-Size-100-MSGP       	    1000	    309114 ns/op	  172416 B/op	    4125 allocs/op
Layer-1-Size-100-FLAT       	    1000	     85.62 ns/op	     120 B/op	       1 allocs/op

分析

不管是嵌套层级数增加还是切片长度增加,整体趋势改变不大。各序列化方案的差异会随着对象复杂度的增加而拉大。
单从性能角度考虑,flatbuffers 的性能很好,原因是 flatbuffers 是直接向 ByteBuffer 里塞字节流的,就省掉了反射的步骤。但这样就牺牲了易用性。编写代码时,连set字段值的顺序都有非常严格的要求。这对研发的要求太高了,可能会导致很多问题。像这种极端难用的,除非有非常迫切的性能需要,否则肯定是不建议使用的。
综合考虑各方面因素,ProtoBuf 脱颖而出,但唯一不好的就是要写 IDL。是否可以通过二次开发或者包装工具的方式来抹平 IDL 带来的缺点。

Gob 从性能和 I/O 带宽占用上都和 ProtoBuf 差不多,唯一劣势是编解码时内存占用较多。考虑到不用再写IDL带来的易用性,在「只使用 Go 语言」的背景下,Gob 是更合适的选择。

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

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

相关文章

高可用高并发常见问题以及答案

什么是高可用系统?如何评估系统的可用性? 高可用系统是指系统能够以高度的稳定性和可靠性运行,即使在面对硬件或软件故障时也能保持正常运行。可用性通常通过系统的 downtime(不可用时间)来评估,例如通过 SLA(Service Level Agreement)来定义系统在特定时间段内可用的…

人工智能与机器学习原理精解【7】

文章目录 凸优化基础理论加权正规方程线性回归模型加权最小二乘法加权正规方程注意使用Diagonal函数使用diagm函数总结 加权最小二乘法加权最小二乘法的定义加权最小二乘法的算法加权最小二乘法的计算加权最小二乘法的原理一、基本思想二、原理详解三、总结 加权最小二乘法的例…

贸易壁垒的作用及影响

目录 什么是贸易壁垒 关税壁垒和非关税壁垒 贸易壁垒的好处 贸易壁垒的负面影响 什么是贸易壁垒 贸易壁垒又称贸易障碍,一般分关税壁垒和非关税壁垒两类。 所谓关税壁垒,是指进出口商品经过一国关境时,由政府所设置的海关向进出口商征收…

外卖霸王餐系统推荐,哪家的系统比较稳定呢?

以下是一些较为稳定且有一定用户基础的外卖霸王餐系统,你可以根据自身需求进一步考察和选择: - **饭否霸王餐**:有专门的APP,如在应用宝上其开发商为南京有惠鲸选电子商务有限公司。它覆盖了多个城市,提供美团、饿了么…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外,还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相,成为赛场上另一道亮丽的风景线。 在新时代的浪潮中,中国制造业坚…

Centos7安装Windows系统默认字体

Centos7安装Windows系统默认字体 拷贝windows系统默认字体(建议拷贝所有)c:\windows\fonts 查看系统默认字体:fc-list 查看系统安装的中文字体:fc-list :langzh 执行: a) sudo yum install -y fontconfig mkfontsca…

AlibabaCloudAI

快速体验 Spring Cloud Alibaba AI JDK要求最低17 1.SpringAI Spring AI 旨在简化包含人工智能相关功能的应用程序的开发,避免不必要的复杂性。 Spring AI 的核心是提供抽象,作为开发 AI 应用程序的基础。这些抽象有多种实现方式,只需极少…

【进阶】Python使用selenium 访问网页完成登录操作页面异常时——最全重试机制汇总

文章目录 思路一:使用添加异常重试机制 [常用]思路二:使用装饰器实现重试机制 [常用]思路三:使用更复杂的异常处理和恢复机制思路四:结合日志记录与重试思路五:使用递归实现重试机制思路六:结合外部配置文件管理重试参数思路七:使用自定义异常类来处理特定错误思路八:使…

Java小白入门到实战应用教程-运算符详解

Java小白入门到实战应用教程-运算符 上节回顾 在上节的内容中我们了解了变量和基本数据类型的内容,现在回顾一下上节课的内容。 声明变量的语法为: 数据类型 变量名; 其中在java中一共有8中基本数据类型,分别是:b…

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统

PACS,即图像存储与传输系统,是应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动,集成了医疗设备,图像存储和分发,数字图像在重要诊断和会诊时的显示&a…

【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解

具有 GPIO 控制器和连接器的硬件配置的备树&#xff08;Device Tree&#xff09;代码讲解 背景 -学习Linux设备树 代码 soc {soc_gpio1: gpio-controller1 {#gpio-cells <2>;};soc_gpio2: gpio-controller2 {#gpio-cells <2>;}; };connector: connector {#gpi…

零侵入零代码零配置全自动接口文档生成可在线调试框架doc-apis它来了!

近期开源了一款全自动零侵入零代码零配置接口文档生成框架doc-apis,实测只要代码符合规范,即可生成多端多语种多格式的接口文档,适合敏捷开发,欢迎大家试用,另外也恳请大家帮忙点一下star,帮助开源项目走得更远,让更多人知道,非常感谢! # 官方地址 | Official website --- **…

OD C卷 - 宽度最小的子矩阵

宽度最小的子矩阵 &#xff08;100&#xff09; 给定一个n行 * m列的矩阵&#xff1b;给定一个k个整数的数组k_list&#xff1b;在n*m的矩阵中找一个宽度最小的子矩阵&#xff0c;该子矩阵包含k_list中所有的整数&#xff1b; 输入描述&#xff1a; 第一行输入n,m 两个整数&am…

Redis的五种数据类型与命令

目录 引言 一 Redis的特性 二 Redis的安装 三 Redis的优点 四 Redis的五种数据类型与命令 五 Redis的配置文件 引言 Redis是什么&#xff1f; Remote Dictionary Service(远程字典服务器) Redis 是一个开源的(BSD许可)的&#xff0c;C语言编写的&#xff0c;高性能的数…

计算机网络实验-RIP配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 路由信息协议&#xff08;Routing Information Protocol&#xff0c;RIP&#xff09;是一种基于距离向量&#xff08;Distance-Vector&…

unity2D游戏开发06稳定,材质,碰撞器

稳定性 在操控玩家时,我们会发现玩家移动时,摄像头会有抖动,这是摄像机过度精确造成的。 创建名为RoundCameraPos的C#脚本,用Visual Studio打开 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine;//导入Cinemac…

rust 初探 -- use

rust 初探 – use Package, Crate, 定义 Module use 关键字 作用&#xff1a;将路径引入到作用域内&#xff0c;其依旧遵循私有性规则&#xff0c;也即只用 pub 的部分引入进来才能使用 use crate::front_of_house::hosting; // 绝对路径 // use front_of_house::hosting; …

【Python机器学习】使用Matplotlib注解绘制树形图

通过数据集可以创建树&#xff0c;但是字典的表示形式非常不易于理解&#xff0c;而且直接绘制图形也比较困难。但是通过Matplotlib库可以绘制树形图。 决策树的主要优点就是直观、易于理解&#xff0c;如果不能将其直观的显示出来&#xff0c;就无法发挥其优势。 Matplotlib…

基于JSP、java、Tomcat三者的项目实战--校园交易网(2)登录,注册功能实现

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 OK&#xff0c;那我们进入正题&#xff0c;随着前面一篇博客的尚未完结基于JSP、java、Tomcat三者的项目实战--校园交易网&#xff08;2&#xff09;登录功能…

微软蓝屏事件:网络安全的多维挑战与应对策略

一、引言 1. 事件概述&#xff1a;微软蓝屏事件的影响与范围 微软蓝屏事件&#xff0c;这一近期震动全球科技界的重大事件&#xff0c;起因于一次看似平常的软件更新。美国电脑安全技术公司“众击”发布的更新包中隐藏着一个致命的“缺陷”&#xff0c;这个缺陷如同潜伏的病毒…