Java 反序列化现有对象上的Google Protobuf wire消息

Java 反序列化现有对象上的Google Protobuf wire消息,java,deserialization,protocol-buffers,google-protocol-buffer,Java,Deserialization,Protocol Buffers,Google Protocol Buffer,我有一个Java应用程序,希望重用现有对象来反序列化传入的Google protobuf wire消息(字节[]) 我试图解码现有的wire消息,并检查生成的类文件中的方法,以查看是否有任何方法对已创建的ProtoBuf类对象上的字节[]进行反序列化 我正在反序列化传入的有线缓冲区(字节[]),但每次我从类上调用parseFrom时,它都会创建Protobuf类的新对象。我想重用类对象。我尝试在对象上调用parseFrom(byte[])方法,但作为一个静态方法,其行为是相同的 下面是示例des

我有一个Java应用程序,希望重用现有对象来反序列化传入的Google protobuf wire消息(字节[])

我试图解码现有的wire消息,并检查生成的类文件中的方法,以查看是否有任何方法对已创建的ProtoBuf类对象上的字节[]进行反序列化

我正在反序列化传入的有线缓冲区(字节[]),但每次我从类上调用parseFrom时,它都会创建Protobuf类的新对象。我想重用类对象。我尝试在对象上调用parseFrom(byte[])方法,但作为一个静态方法,其行为是相同的

下面是示例deserializeMessage()方法:

是否有任何选项可重复使用对象对进线mesage(字节[])进行解码

这些是我在Java中序列化和反序列化100k消息、运行10次迭代并获得所有数字的平均值时的性能数字

Msg Size|Total Data Processed (Mb)|Java Serialize Time|Java Deserialize Time
195     |19.5                     |                 19|                   45
1095    |109.5                    |                 84|                  132
2095    |209.5                    |                160|                  233
3095    |309.5                    |                230|                  294
4095    |409.5                    |                847|                 2465
5095    |509.5                    |               1037|                 3006
6095    |609.5                    |               1266|                 3766

您只能重用构建器,它只是一个指针。我打赌你有很强的C语言背景。你不必担心,这对于一个现代垃圾收集器来说是非常便宜的。对它进行基准测试,你就会明白。你对“C”的理解是对的。是的,我做了性能测试,在尝试反序列化~100k条消息时,当消息大小>4095字节(大约)时,数字不好。反序列化从295ms跳到2465ms(2.5秒)。串行化也从230ms=>847ms(虽然不多,但不是线性的)跃升。我怀疑这与页面大小(4K)或一级/二级缓存有关,但目前还没有。因此,我们更加关注优化反序列化。我也试过MessagePack,处理时间是基于消息大小+消息总数的良好线性增长。这确实有点奇怪。我目前正在运行一些线程,在一台t2.nano机器(1“vcpu”,512MB ram)中,以平均1187微秒/消息的速度反序列化125KB的proto消息。经过测试,其中一个线程在一分钟内平均反序列化了2.5GB的原始消息(125KB),两天内没有任何顾虑,反序列化是整个“消息处理循环”中最快的步骤之一,cpu和内存指标非常稳定。您的JVM堆大小是多少?嗯,只是读了MsgPack的评论。。。所以它可能与jvm无关。jvm堆大小是默认值。我没有设置任何特定的值:这就是我看到的:uintx-HeapSizePerGCThread=87241520{product}Hmm无法真正判断这是否是gc/内存问题。它也可能与protobuff消息的格式、其中的对象等有关,。。。。
Msg Size|Total Data Processed (Mb)|Java Serialize Time|Java Deserialize Time
195     |19.5                     |                 19|                   45
1095    |109.5                    |                 84|                  132
2095    |209.5                    |                160|                  233
3095    |309.5                    |                230|                  294
4095    |409.5                    |                847|                 2465
5095    |509.5                    |               1037|                 3006
6095    |609.5                    |               1266|                 3766