proto3编码-结构与封送结构

时间:2018-11-13 09:17:46

标签: encoding protocol-buffers proto3

我想知道在封送处理一个结构体与封送处理一个封送处理的结构体之间在内存效率方面是否有任何显着差异。

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

message B{...}

常见表示形式:

message A {
    B b = 1;
}

另一种方式:

message A {
    bytes b = 1;
}

其中b是封送的B结构。

通常,这是一种好习惯吗?有效率影响吗?

谢谢, 逃跑

2 个答案:

答案 0 :(得分:1)

在有效负载级别上,它们是相同的-但是,就实现方式对其进行处理而言,可能存在差异。 最明显的区别是,在进一步反序列化之前,不能使用bytes。这有优点也有缺点:

  • 如果您无论如何都不会碰它,那可能很好并且很有利-避免了一些您不需要读写的CPU处理;这也意味着不需要进行任何下游分配(字符串等)-因此,您只有一个分配块:简单而高效
  • 如果您需要阅读 ,那么除了使生活变得不那么方便之外,您还可以为 raw 表格分配一块额外的内存(一块字节),,您需要为反序列化形式分配;如果您直接将 转换为反序列化形式,则大多数实现将跳过该中间分配

所以:是的,它将具有不同的特征。它们是否有利(或相反)取决于您是否还需要对bytes有效负载执行反序列化步骤

答案 1 :(得分:1)

我认为声明bytes字段而不是原本应在原型文件中指定的结构是一种不好的做法。

这称为规范漏洞:您将不得不编写其他文档来描述接收方如何理解字节