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。