Я пишу класс proto3 для объекта, который в настоящее время имеет около двух вариаций и вырастет до 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...
}
Меня особенно интересуют размер провода и его характеристики.
Во втором варианте, учитывая, что будет установлен только один из вариантов (применяется на уровне приложения), будет ли размер провода больше, чем в первом? Зарезервирована ли память и для нулевых полей?