Protobuf getAllFields()性能

时间:2015-05-19 17:09:05

标签: java performance protocol-buffers

我们使用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吗?

感谢。

1 个答案:

答案 0 :(得分:3)

<input type="text" ng-model="radius"> 是Protobuf反射界面的一部分(不要与Java的反思相混淆)。无论如何,Protobuf反射非常慢 - 它本质上就像使用解释性语言而不是编译语言。

如果您需要快速编写代码,那么执行此操作的方法是直接调用生成的代码方法。不幸的是,如果你在每个领域做一些重复的事情,这可能会很乏味。您可以考虑的一件事是为getAllFields()编写代码生成器插件以自动生成重复代码(很像protoc生成protobuf类本身的代码)。有关如何执行此操作的详细信息,请参阅the docs on descriptor.proto

相关问题