我的结构包含一个重复的字段,它本身就是一个小结构,只包含两个整数:
message Bin {
optional int32 slot = 1;
optional int32 count = 2;
}
message Histogram {
repeated Bin bin = 1; // Might be about 200 - 400 bins.
}
如果我将Bin
和slot
定义为count
,required
会更有效地编码吗?
我认为如果不太可能发生变化,我可以完全重新定义Bin
消息并将Histogram
修改为
repeated Bin2 bin2 = 2;
(repeated
字段可以删除)
答案 0 :(得分:1)
不,基本上; encoding details are here,但无论是optional
还是required
,slot
/ 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个项目的打包重复字段的作用如下: