Google协议缓冲区中的必填字段是否更有效?

时间:2014-09-05 06:12:19

标签: protocol-buffers

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

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

   message Histogram {
     repeated Bin bin = 1; // Might be about 200 - 400 bins.
   }

如果我将Binslot定义为countrequired会更有效地编码吗?

我认为如果不太可能发生变化,我可以完全重新定义Bin消息并将Histogram修改为

repeated Bin2 bin2 = 2; 

repeated字段可以删除)

1 个答案:

答案 0 :(得分:1)

不,基本上; encoding details are here,但无论是optional还是requiredslot / count的eash将是varint field-header / wire-type组合然后是值的变量。 optional vs required不会更改格式:它只会更改是否需要该值。有趣的是,repeated值与正好一个值与存在的optional / 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个项目的打包重复字段的作用如下:

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