生成的 Java 代码始终分配一个本地UnknownFieldSet.Builder,随着时间的推移,它会增加对象的变动,尤其是在小消息中。未知字段在我们的环境中相当罕见,因此在大多数情况下这种分配是不必要的。
这里是我们在产品中使用的自定义字符串消息的生成代码(它显示在我们的指标中,这意味着逃逸分析未涵盖此内容):
private String(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new java.lang.NullPointerException();
}
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
...
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
...
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
knownFields可以用null初始化,并且仅在收到实际未知字段时在默认情况下分配。在finally块中,需要检查是否为null。