protobuff vs json

本文讨论 protobuff 和 json 作为消息传递格式的优缺点。
消息处理的过程包括:接收到二进制 -> 切包 -> 解码 -> 消息分发 -> 处理消息
所以我们决定从 1. 包的大小 2. 编解码速度 来讨论两者

1. 包的大小

protobuff 的编码方式

在看protobuff 之前,我们需要知道pb并没有自己切tcp包的代码,常用的做法还是程序自己去做切包处理。切好包之后,自然会有几个问题?

  1. pb 是用 长度+type+data 来确定字段和字段的边界的么?
  2. 如果是 那么长度字段是定长的么? 如果定长,那么长度字段是否太过浪费。。
  3. 如果不是 长度+type+data, 那么怎么解决string的传输呢?毕竟int型可以定长,string肯定不是定长的。

pb用很聪明的方法解决了以上的问题:
pb在内部有六种基本数据类型。分别是
-define(TYPE_VARINT, 0).
-define(TYPE_64BIT, 1).
-define(TYPE_STRING, 2).
-define(TYPE_START_GROUP, 3).
-define(TYPE_END_GROUP, 4).
-define(TYPE_32BIT, 5).

0. TYPE_VARINT

程序在定义proto中用到的sint32 int32 uint64 bool enum 等都属于TYPE_VARINT 类型. 使用filedid + type + value 的方式来做。但是这并不表示value是定长的,其实pb用每个字节的第一个比特作为标识位,如果标识位为1,则下个字节就是属于这个value的,否则就不是。

1.TYPE_64BIT 5.TYPE_32BIT

proto中用到的 fixed32,float属于TYPE_32BIT。fixed64,double 属于TYPE_32BIT. 使用filedid+type+value来做。其中value是定长的

2. TYPE_STRING

proto中用到的 string bytes 属于 TYPE_STRING. 使用filedid+type+len+value. 这样可以使得string不是定长的。其中len不是定长的,是用varint的方式来表示的。

json vs protobuff

json很简单,json在未经压缩的情况下,是要比pb的包大的。
参考:https://google.github.io/flatbuffers/flatbuffers_benchmarks.html

2. 编解码速度

参考:https://google.github.io/flatbuffers/flatbuffers_benchmarks.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值