标签:performance protocol-buffers java
我们使用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。