大佬教程收集整理的这篇文章主要介绍了c# – 协议缓冲区数组中浪费的字节数?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
[ProtoContract] Foo { [ProtoMember(1)] Bar[] Bars; }@H_607_8@单个Bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道Bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀.
但是,当我使用20 Bars的数组编码Foo时,需要1362个字节. 20 * 67是1340,所以只有22个字节的开销用于编码数组!
为什么这会占用这么多空间?我能做些什么来减少它吗?
如果你真的想要血淋淋的细节:
数组或列表(如果我们排除“打包”,这里不适用)只是重复的子消息块.有两种布局可用于子消息;字符串和组.使用字符串,布局为:
[header][length][data]@H_607_8@其中header是wire-type和field-number的varint编码的mash(在这种情况下为字段1的十六进制08),length是varint编码的数据大小,data是子对象本身.对于小对象(数据小于128字节),这通常意味着每个对象有2个字节的开销,具体取决于:字段编号(15以上的字段占用更多空间),b:数据的大小.
对于一个组,布局是:
[header][data][footer]@H_607_8@其中header是wire-type和field-number的varint编码的mash(在这种情况下是字段1的十六进制0B),data是子对象,footer是另一个varint mash,用于指示对象的结尾(hex在这种情况下0C与字段1).
群体通常不那么受欢迎,但它们的优势在于,随着数据量的增长,它们不会产生任何开销.对于小的字段数(小于16),开销是每个对象2个字节.当然,您需要为大字段数支付双倍的费用.
以上是大佬教程为你收集整理的c# – 协议缓冲区数组中浪费的字节数?全部内容,希望文章能够帮你解决c# – 协议缓冲区数组中浪费的字节数?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。