当前位置: 首页 > news >正文

protobuf为什么快

前言

pb的优点

压缩率高

pb的数据类型

Protocol buffer时需要用户自定义自己的结构体,而且结构体中的定义规则要符合google制定的规则。结构体中每个字段都需要一个数据类型,protocol buffer支持的数据类型在源代码wire_format_lite.h中定义:

每类数据包含的具体数据类型如下表所示:

protobuf的编码

ProtocolBuffer的编码是尽其所能地将字段的元信息和字段的值压缩存储,并且字段的元信息中含有对这个字段描述的所有信息。

整个结构体序列化后抽象地看起来像下图这样:

可以看到,整个消息是以二进制流的方式存储,在这个二进制流中,逐个字段以定义的顺序紧紧相邻。每个字段中由元信息tag和字段的值value组成。

其中tag是这样编码的:

1)field_number << 3 | wire_type

2)对上面得到的无符号类型整数做variant编码

其中field_number是每个字段的标号,wire_type是该字段的数据类型。

variant编码

variant是一种紧凑型数字编码,将元数据跟数字保存在一起,如下图所示是数字131415的variant编码:

其中第一个字节的高位msb(Most Significant Bit )为1表示下一个字节还有有效数据,msb为0表示该字节中的后7为是最后一组有效数字。踢掉最高位后的有效位组成真正的数字。

从上面可以看出,variant编码存储比较小的整数时很节省空间,小于等于127的数字可以用一个字节存储。但缺点是对于大于268,435,455(0xfffffff)的整数需要5个字节来存储。但是一般情况下(尤其在tag编码中)不会存储这么大的整数。

各类元素的序列化编码详解
 int32/int64/uint32/uint64类型的编码

例如用户为int32传入值123,则该字段的存储如下:

第一个字节variant(1<<3|0)  第二个字节variant(123)

String类型的编码

例如用户为string传入值“hello”,则该字段的存储如下:

第一个字节variant(2<<3|2) ,第二个字节variant(5) ,剩余的字节 “hello”

float类型的编码

 嵌套结构体 编码

repeated类型字段编码

sint32, sint64类型字段编码

从int32编码中可以看出,当int32传入-1时所耗的空间很大,所以结构体定义中引入了sint32和sint64类型的数据,这种数据采用一种叫zigzag的编码方式,使绝对值比较小的整数也占用比较小的字节。

Zigzag编码规则如下:

  • 如果数据是负数,那么套用2*|x|-1来编码表示
  • 如果数据是正数,那么套用2*|x| 来编码表示

那么对于-1,就编成1,再二进制表示,就是00000001

上面的编码都是基于数字编码,那么如果传输字符串,就显得不太方便。

解析快

支持多语言

参考

Protobuf原理与序列化-CSDN博客

为什么protobuf这么快_protocolbuffer为什么效率高-CSDN博客

Why Protocol Buffer So Fast? ----protobuf编码详解 - CobbLiu - 博客园

相关文章:

  • 基于ssm的微博网站(全套)
  • 流量分析2
  • VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶二
  • 核心知识——论文详解
  • 力扣DAY27 | 热100 | 合并两个有序链表
  • 万字C++STL——vector模拟实现
  • LeetCode 524 通过删除字母匹配到字典里最长单词
  • 虚幻引擎设置复杂碰撞体
  • docker使用uv安装依赖
  • 探索Halo:不止是博客,更是创作新宇宙
  • VUE3项目VITE打包优化
  • [BalticOI 2009] Radio Transmission 无线传输
  • 项目日记 -云备份 -服务端数据管理模块
  • Qt Concurrent 并发 Map 和 Map-Reduce
  • Chat2DB:一款强大的数据库管理工具,AI助力高效查询与分析
  • 如何使用Python爬虫按关键字搜索1688商品?
  • SQL HAVING 1 的用法解析
  • 鸿蒙开发:父组件如何调用子组件中的方法?
  • python tkinter 开发蓍草占卜系统
  • Vue3企业级项目标准化规范
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 金融月评|尽早增强政策力度、调整施策点
  • 江苏省委组织部副部长高颜已任南京市委常委、组织部部长
  • 租车订单时隔7年从花呗免密扣费?“GoFun出行”引质疑
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • 南方降水频繁暴雨连连,北方高温再起或现40°C酷热天气