【发布时间】:2020-07-01 21:57:39
【问题描述】:
我正在为一个对象编写一个 proto3 类,该对象目前有大约 2 个变体,并且将增长到 6 或 7 个。只有其中一个会在消息中使用。这些变体不共享公共字段。它们将被编码为父消息中的子消息。这些消息将被写入一次并读取数万次。
我想知道什么是最高效的方式,内存和解析明智的时间,以实现这一点,以便随着更多变体的添加,性能不会丢失。
考虑以下变化。
message B1 {
repeated string value = 1;
bool hasMeta = 2;
}
message B2 {
repeated int32 value = 1;
map<string, string> foo = 2;
}
第一个选项:定义一个引用特定子类型的oneof 字段。
message P1 {
oneof parents {
B1 boo = 1;
B2 baz = 2;
// add more variations here in future..
}
// other non-related fields...
}
第二个选项:定义一个整数,作为可用变体的标识符。在运行时,此整数可用于确定已设置的变体(另一种方法是对变体进行空检查并使用第一个非空值)。
message P1 {
int32 type = 1;
B1 boo = 2;
B2 baz = 3;
// other non-related fields...
}
我对电线尺寸和性能特别感兴趣。
在第二个选项中,考虑到只设置一个变体(在应用层中强制执行),线尺寸会比第一个更大吗?是否也为空字段保留内存?
【问题讨论】:
标签: protocol-buffers proto proto3