Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Protobuf getAllFields()性能_Java_Performance_Protocol Buffers - Fatal编程技术网

Java Protobuf getAllFields()性能

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

我们使用protobuf作为我们的消息传递,每一条消息,我们循环通过集合字段,并用它做一些事情

我们使用

    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);