protobuf 字段排序如何影响在线大小?
How does protobuf field ordering affect on-the-wire size?
我无法在文档或网上找到关于此的非常清晰的信息(不过请随时为我指出正确的方向),但是在 protobuf 消息中对字段进行排序(使用 syntax = proto3
) 影响最终的线上尺寸?例如,假设我有以下消息:
message Message {
int x = 1;
string y = 2;
}
如果我指定为
message Message {
string y = 1;
int x = 2;
}
在两个消息规范下执行诸如 Message {x = 1, y = "foo"}
之类的操作时,生成的编译在线大小会发生变化还是会相同?
这如何与 repeated
字段一起使用?例如
message Msg {
int x = 1;
repeated string strs = 2;
}
对
message Msg {
repeated string strs = 1;
int x = 2;
}
在这种情况下,将 repeated
字段放在首位还是将 int
字段放在首位更有利?
根据顺序没有影响。字段 header 在任一位置采用相同的 space - 它不依赖于以前的数据。 with repeated: re space 的主要相关因素是整数等基元是否被“打包”,但 a: 这不适用于字符串,b: proto3 中默认打包合适的重复字段,如果它们有足够的元素来实现一个好处(过去你必须在原型架构中选择支持打包布局的东西)。
可以关心的是字段号。小字段号占用较少space。基本上:找到您要使用的字段号的位长;添加 3 位(对“线型”进行编码);现在除以 7(如果余数不为零则加一,即“四舍五入”):这就是编码字段 header 所需的字节数。所以:优先选择字段 1、2 和 3,而不是字段 100001、100002 和 100003。
我无法在文档或网上找到关于此的非常清晰的信息(不过请随时为我指出正确的方向),但是在 protobuf 消息中对字段进行排序(使用 syntax = proto3
) 影响最终的线上尺寸?例如,假设我有以下消息:
message Message {
int x = 1;
string y = 2;
}
如果我指定为
message Message {
string y = 1;
int x = 2;
}
在两个消息规范下执行诸如 Message {x = 1, y = "foo"}
之类的操作时,生成的编译在线大小会发生变化还是会相同?
这如何与 repeated
字段一起使用?例如
message Msg {
int x = 1;
repeated string strs = 2;
}
对
message Msg {
repeated string strs = 1;
int x = 2;
}
在这种情况下,将 repeated
字段放在首位还是将 int
字段放在首位更有利?
根据顺序没有影响。字段 header 在任一位置采用相同的 space - 它不依赖于以前的数据。 with repeated: re space 的主要相关因素是整数等基元是否被“打包”,但 a: 这不适用于字符串,b: proto3 中默认打包合适的重复字段,如果它们有足够的元素来实现一个好处(过去你必须在原型架构中选择支持打包布局的东西)。
可以关心的是字段号。小字段号占用较少space。基本上:找到您要使用的字段号的位长;添加 3 位(对“线型”进行编码);现在除以 7(如果余数不为零则加一,即“四舍五入”):这就是编码字段 header 所需的字节数。所以:优先选择字段 1、2 和 3,而不是字段 100001、100002 和 100003。