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