1

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

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

message B{...}

常见的表示:

message A {
    B b = 1;
}

另一种方式:

message A {
    bytes b = 1;
}

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

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

谢谢, 埃拉德

4

2 回答 2

1

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

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

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

于 2018-11-13T09:25:39.430 回答
1

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

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

于 2018-11-13T10:03:42.427 回答