Encoding proto3编码-结构与封送结构

Encoding proto3编码-结构与封送结构,encoding,protocol-buffers,proto3,Encoding,Protocol Buffers,Proto3,我想知道在封送结构和封送已封送结构之间,在mem效率方面是否有任何显著差异 例如: 假设我们有一个带一些字段的结构B message B{...} 共同代表: message A { B b = 1; } 另一种方式: message A { bytes b = 1; } 其中b是封送的b结构 一般来说,这是一个好的做法吗?对效率有何影响 谢谢, Elad在有效负载级别,它们是相同的-但是,在实现如何处理它们方面,可能存在差异。最明显的区别是,在进一步反序列化之前,不能使用

我想知道在封送结构和封送已封送结构之间,在mem效率方面是否有任何显著差异

例如: 假设我们有一个带一些字段的结构B

message B{...}
共同代表:

message A {
    B b = 1;
}
另一种方式:

message A {
    bytes b = 1;
}
其中b是封送的b结构

一般来说,这是一个好的做法吗?对效率有何影响

谢谢,
Elad

在有效负载级别,它们是相同的-但是,在实现如何处理它们方面,可能存在差异。最明显的区别是,在进一步反序列化之前,不能使用
字节
;这有优点也有缺点:

  • 如果你从来没有接触过它,这可能是好的和有利的-避免一些CPU处理,你不需要读或写;这也意味着任何下游分配(字符串等)都不需要发生——因此您只有一个分配块:简单高效
  • 如果您确实需要读取它,那么除了让生活变得不那么方便之外,您还可以为原始表单分配额外的内存块(字节块),并且需要为反序列化表单分配额外的内存块;如果直接使用反序列化表单,大多数实现都会跳过该中间分配

所以:是的,它会有不同的特点。它们是否有利(或相反)取决于您是否还需要对
字节
有效负载执行额外的反序列化步骤

我认为声明
字节
字段而不是在proto文件中指定的结构是一种不好的做法


这被称为规范漏洞:您必须编写额外的文档来描述接收者如何理解字节

次要点-注意,没有所谓的“proto3编码”-编码在公共protobuf时间内根本没有改变;“proto3”只与DSL语法相关,根本不影响编码。