是FlatBuffer的Java实现';什么是零分配?

是FlatBuffer的Java实现';什么是零分配?,java,flatbuffers,Java,Flatbuffers,我的Java应用程序正在数据库中存储Protobuf消息。应用程序速度很快,但可以使其更快,因为并非消息的所有部分都始终被使用,从而导致在不需要的数据上浪费CPU周期。此外,有些消息具有树状结构,导致分配的内存比我希望的要多 在做了一些研究之后,FlatBuffers似乎是一个不错的替代品,因为它声称它是零分配/零解析。然而,已经运行了反对C++。我的应用程序是用Java编写的。FlatBuffer的Java实现是否仍然很快,是否仍然是零分配/零解析?从中可以看出,解析和对象分配都是在属性访问时

我的Java应用程序正在数据库中存储Protobuf消息。应用程序速度很快,但可以使其更快,因为并非消息的所有部分都始终被使用,从而导致在不需要的数据上浪费CPU周期。此外,有些消息具有树状结构,导致分配的内存比我希望的要多

在做了一些研究之后,FlatBuffers似乎是一个不错的替代品,因为它声称它是零分配/零解析。然而,已经运行了反对C++。我的应用程序是用Java编写的。FlatBuffer的Java实现是否仍然很快,是否仍然是零分配/零解析?

从中可以看出,解析和对象分配都是在属性访问时延迟进行的


至于速度,我无法想象这会比从数据库中获取数据的速度慢多少,但请随意对其进行基准测试:-)

它试图尽可能接近零分配,但这并不完全可能

例如,C++中的值(C和C)的访问对象是java中的一个分配。但是,它们可以跨多个对象重复使用,因此成本较低,代码复杂度稍高

更糟糕的是字符串,在FlatBuffers中是UTF-8,但Java不直接支持UTF-8。因此,如果您想将其作为
字符串访问,则必须对其进行转换和分配。您也可以通过UTF-8
ByteBuffer
来访问它,但是很少有API可以使用它


但是,如果不是所有部分的数据都被使用,或者不是增量使用,这仍然比一次性解包/分配所有数据有很大的好处。

值得补充的是,现代JVM执行转义分析,如果对象没有转义调用堆栈帧,则可以在堆栈上分配对象。因此,重用对象不一定更快,而且由于缓存未命中的增加,实际上可能会变得更慢。