在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”如何提高编码基本数值数据类型的效率吗?
答案 0 :(得分:1)
基本上,在原始编码下,每个元素都会出现字段标题(由线型与字段编号组合,位移和/或组合)。因为标头是varint编码的,所以每个元素至少有一个字节,但可能更多。因此,如果头部占用5个字节(大字段数比小字段数占用更多空间),则10个4字节浮点数至少为50个字节,很可能为90个字节。
使用压缩编码时,字段标题仅出现一次,后跟一个varint,指示要遵循的字节数。因此,对于10个浮点数,有效负载长度为40,对于长度前缀,这是在单个字节中进行varint编码。在反序列化时,它只消耗那么多字节,读取元素就像这样做。因此,对于相同的数据(先前50到90个字节),我们现在使用42到46个字节(同样,对于每个需要1到5个字节的字段数范围)。
这两种布局在线路上非常不同,而期望一个的代码通常无法解码另一个。因此,需要明确启用它以防止破坏现有消息。