我们使用protobuf作为我们的消息,每条消息,我们通过设置字段循环,并使用它做一些事情。
我们使用
循环它 for ( final Map.Entry<Descriptors.FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) {
FieldDescriptor field = entry.getKey();
Object value = entry.getValue();
在profiler下,我们发现这个GetAllFields大部分时间都在使用,我做了一些研究,看起来没有别的办法了。
我知道我们可以使用这样的东西:
for ( final FieldDescriptor field : msg.getDescriptorForType().getFields()) {
if (!msg.hasField(field)){
continue;
}
Object value = message.getField(field);
但getDescriptorForType返回所有字段而不仅仅是设置字段。
有没有人知道通过字段循环的另一种更好的表现方式?我相信getAllFields的问题是每次创建一个新的地图,还有反射。我可以强制它使用内部的Trove地图而不是常规的hashmap吗?
感谢。
答案 0 :(得分:3)
<input type="text" ng-model="radius">
是Protobuf反射界面的一部分(不要与Java的反思相混淆)。无论如何,Protobuf反射非常慢 - 它本质上就像使用解释性语言而不是编译语言。
如果您需要快速编写代码,那么执行此操作的方法是直接调用生成的代码方法。不幸的是,如果你在每个领域做一些重复的事情,这可能会很乏味。您可以考虑的一件事是为getAllFields()
编写代码生成器插件以自动生成重复代码(很像protoc
生成protobuf类本身的代码)。有关如何执行此操作的详细信息,请参阅the docs on descriptor.proto。