Java 是 Fl​​atBuffer 零分配的实现吗?

Is the Java implementation for FlatBuffer's zero-allocation?

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

经过一些研究,FlatBuffers 似乎是一个不错的替代品,因为它声称它是 zero-allocation/zero-parse。但是,benchmarks 已被 运行 反对 C++。我的申请是用Java写的。 FlatBuffer 的 Java 实现是否仍然很快并且仍然是 zero-allocation/zero-parse?

library code 判断,解析和对象分配都是在 属性 访问时延迟发生的。

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

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

例如,在 C++(和 C#)中作为值的访问器对象在 Java 中是一个分配。但是,它们可以跨多个对象重复使用,因此它们的成本可以很低,但代码复杂度更高。

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

但是,如果不是所有部分的数据都被使用,或者增量使用,这仍然比 unpacking/allocating 一次所有的东西都大。