Protocol buffers 在Google协议缓冲区中,必填字段的编码效率是否更高?

Protocol buffers 在Google协议缓冲区中,必填字段的编码效率是否更高?,protocol-buffers,Protocol Buffers,我的结构包含一个重复字段,该字段本身是一个小结构,仅包含两个整数: message Bin { optional int32 slot = 1; optional int32 count = 2; } message Histogram { repeated Bin bin = 1; // Might be about 200 - 400 bins. } 如果我将slot和count定义为必需的,那么Bin的编码效率会更高吗 我认为如果出

我的结构包含一个重复字段,该字段本身是一个小结构,仅包含两个整数:

   message Bin {
     optional int32 slot = 1;
     optional int32 count = 2;
   }

   message Histogram {
     repeated Bin bin = 1; // Might be about 200 - 400 bins.
   }
如果我将
slot
count
定义为
必需的
,那么
Bin
的编码效率会更高吗

我认为如果出现不太可能的变化,我可以完全重新定义
Bin
消息,并将
直方图修改为

repeated Bin2 bin2 = 2; 
重复的
字段可以删除)

基本上没有;但无论是
可选的
还是
必需的
插槽的eash
/
计数
都将是一个变量字段头/导线类型组合,后跟一个变量值
optional
vs
required
不会更改格式:它只是更改值是否为required。有趣的是,
重复的
值与存在的
可选的
/
必需的
值之间实际上没有区别。唯一改变的是重复原语的“压缩”编码。如果有,实际上可以从1或2个压缩阵列获得更高效的数据:

message Histogram {
  repeated int32 slots = 1 [packed=true];
  repeated int32 counts = 2 [packed=true];
}
上述方法不太方便,但在电线上更有效。当然,您也可以使用单个双倍长度数组执行相同的操作:

message Histogram {
  repeated int32 slotsAndCounts = 1 [packed=true];
}
包含5项的正常重复字段的作用如下:

  • 字段标题,值,字段标题,值,字段标题,值,字段标题,值,字段标题,值
包含5项的压缩重复字段的作用如下:

  • 字段标题,长度,值,值,值,值,值,值

否,每个字段前都有一个字段编号/字段类型字段,后跟数据