protobuf js中基本数字数据类型的高效编码

时间:2014-01-05 15:59:31

标签: protocol-buffers performance

在Protobuffers文档中,已经给出了

"For historical reasons, repeated fields of basic numeric types aren't encoded as 

efficiently as they could be. New code should use the special option [packed=true] to get 

a more efficient encoding. For example:

repeated int32 samples = 4 [packed=true];"

有人可以清楚地解释语句“packed = true”如何提高编码基本数值数据类型的效率吗?

1 个答案:

答案 0 :(得分:1)

基本上,在原始编码下,每个元素都会出现字段标题(由线型与字段编号组合,位移和/或组合)。因为标头是varint编码的,所以每个元素至少有一个字节,但可能更多。因此,如果头部占用5个字节(大字段数比小字段数占用更多空间),则10个4字节浮点数至少为50个字节,很可能为90个字节。

使用压缩编码时,字段标题仅出现一次,后跟一个varint,指示要遵循的字节数。因此,对于10个浮点数,有效负载长度为40,对于长度前缀,这是在单个字节中进行varint编码。在反序列化时,它只消耗那么多字节,读取元素就像这样做。因此,对于相同的数据(先前50到90个字节),我们现在使用42到46个字节(同样,对于每个需要1到5个字节的字段数范围)。

这两种布局在线路上非常不同,而期望一个的代码通常无法解码另一个。因此,需要明确启用它以防止破坏现有消息。