C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 协议缓冲区数组中浪费的字节数?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个像这样的协议缓冲区设置:

[ProtoContract]
Foo
{
    [ProtoMember(1)]
    Bar[] Bars;
}@H_607_8@ 
 

单个Bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道Bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀.

但是,当我使用20 Bars的数组编码Foo时,需要1362个字节. 20 * 67是1340,所以只有22个字节的开销用于编码数组!

为什么这会占用这么多空间?我能做些什么来减少它吗?

解决方法

这个开销很简单,它需要知道20个对象中每个对象的开始和结束位置.在没有破坏格式的情况下,我可以做任何不同的事情(即做一些违反规范的事情).

如果你真的想要血淋淋的细节:

数组或列表(如果我们排除“打包”,这里不适用)只是重复的子消息块.有两种布局可用于子消息;字符串和组.使用字符串,布局为:

[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,请注明来意。