Java Protobuf getAllFields()性能
我们使用protobuf作为我们的消息传递,每一条消息,我们循环通过集合字段,并用它做一些事情 我们使用Java Protobuf getAllFields()性能,java,performance,protocol-buffers,Java,Performance,Protocol Buffers,我们使用protobuf作为我们的消息传递,每一条消息,我们循环通过集合字段,并用它做一些事情 我们使用 for ( final Map.Entry<Descriptors.FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) { FieldDescriptor field = entry.getKey(); Object value = entry.ge
for ( final Map.Entry<Descriptors.FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) {
FieldDescriptor field = entry.getKey();
Object value = entry.getValue();
但是getDescriptorForType返回所有字段,而不仅仅是设置的字段
有没有人知道另一种更好的循环穿越场地的方法?我相信getAllFields的问题在于每次都创建一个新的映射,还有反射。我可以强制它在内部使用Trove映射而不是常规hashmap吗
谢谢。getAllFields()
是Protobuf反射接口的一部分(不要与Java的反射混淆)。唉,Protobuf反射相当慢——它本质上类似于使用解释语言而不是编译语言
如果您需要快速编写代码,可以直接调用生成的代码方法。不幸的是,如果你在每一个领域都做重复的事情,这可能会很乏味。你可以考虑编写一个代码生成器插件,用于<代码> PotoCo/<代码>自动生成重复代码(很像<代码> PotoCu/Cuff>为原始BooF类自己生成代码)。有关如何执行此操作的更多信息,请参阅。有人对两种循环方式提出建议吗。哪一个性能更好?对于这个链接,任何java版本的等价物?@Ted getAllFields()在内部基本上都会在所有字段上循环检查每个字段是否存在,所以自己这样做可能会更快。如果您使用扩展,那么在描述符字段上循环并不能告诉您一切。关于descriptor.proto链接,它是一个protobuf;你可以用任何语言。
for ( final FieldDescriptor field : msg.getDescriptorForType().getFields()) {
if (!msg.hasField(field)){
continue;
}
Object value = message.getField(field);