编程语言
首页 > 编程语言> > java-Protobuf getAllFields()性能

java-Protobuf getAllFields()性能

作者:互联网

我们使用protobuf作为消息传递,每条消息都循环遍历set字段,并对其进行处理.

我们使用

    for ( final Map.Entry<Descriptors.FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) {
            FieldDescriptor field = entry.getKey();
            Object value = entry.getValue();

在事件探查器下,我们发现此GetAllFields大部分时间都在使用,并且我进行了一些研究,似乎没有其他方法.

我知道我们可以使用以下方法:

    for ( final FieldDescriptor field : msg.getDescriptorForType().getFields()) {
        if (!msg.hasField(field)){
            continue;
        }
        Object value = message.getField(field);

但是getDescriptorForType返回所有字段,而不仅仅是返回设置的字段.

有谁知道一种更好的循环遍历这些字段的方法?我相信getAllFields的问题每次都会创建一个新地图,并且还会进行反射.我可以强制其在内部使用Trove映射而不是常规的哈希映射吗?

谢谢.

解决方法:

getAllFields()是Protobuf的反射接口的一部分(不要与Java的反射相混淆). to,Protobuf反射非常慢-本质上就像是使用一种解释语言而不是一种编译语言.

如果您需要快速编写代码,则可以直接调用生成的代码方法.不幸的是,如果您要对每个领域重复进行某些操作,这可能会很乏味.您可能要考虑的一件事是为protoc编写代码生成器插件,以自动生成重复代码(就像protoc为protobuf类本身生成代码).有关如何执行此操作的更多信息,请参见the docs on descriptor.proto.

标签:performance,protocol-buffers,java
来源: https://codeday.me/bug/20191120/2042903.html