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
vsrequired
不会更改格式:它只是更改值是否为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项的压缩重复字段的作用如下:
- 字段标题,长度,值,值,值,值,值,值
否,每个字段前都有一个字段编号/字段类型字段,后跟数据