【问题标题】:proto3 encoding - struct vs marshaled structproto3 编码 - 结构与封送结构
【发布时间】:2018-11-13 09:17:45
【问题描述】:

我想知道在封送结构和封送结构之间的内存效率方面是否存在显着差异。

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

message B{...}

常见的表示:

message A {
    B b = 1;
}

另一种方式:

message A {
    bytes b = 1;
}

其中 b 是一个编组的 B 结构。

一般来说,这是一个好习惯吗?任何效率影响?

谢谢, 埃拉德

【问题讨论】:

  • 次要点 - 请注意,没有“proto3 编码”之类的东西 - 在公共 protobuf 时间内编码根本没有改变; “proto3”仅与 DSL 语法有关,根本不影响编码。

标签: encoding protocol-buffers proto3


【解决方案1】:

在有效负载级别,它们是相同的 - 但是,就实现方式处理它们而言,可能存在差异。最明显的区别是你不能使用bytes,除非你进一步反序列化它;这有利有弊:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多