protobuffers中基本数字数据类型的有效编码



在Protobabuffers文档中,它被赋予了

"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"这句话是如何提高编码基本数字数据类型的效率的吗??

基本上,在原始编码下,每个元素都会出现字段标头(由导线类型与字段号、位偏移和/或'd组合而成)。因为标头是可变编码的,所以每个元素至少有一个字节,但可能更多。因此,如果报头占用5个字节(大字段号比小字段号占用更多空间),10个4字节的浮点值将至少为50个字节,并且很可能为90个字节。

对于压缩编码,字段头只出现一次,后面跟着一个变量,表示要跟随的字节数。因此,对于10个浮点值,有效载荷长度为40,它被可变编码为长度前缀的单个字节。在反序列化时,它只消耗那么多字节,同时读取元素。因此,对于相同的数据(以前是50到90个字节),我们现在使用42到46个字节(同样,对于每个需要1到5个字节的字段号范围)。

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

最新更新