我的 Java 应用程序将 Protobuf 消息存储在数据库中。该应用程序速度很快,但它可以变得更快,因为并非总是使用消息的所有部分,从而导致在不需要的数据上浪费 CPU 周期。此外,一些消息具有树状结构,导致分配的内存比我想要的要多。
在做了一些研究之后,FlatBuffers 似乎是一个不错的替代品,因为它声称它是零分配/零解析。但是,基准测试是针对 C++ 运行的。我的应用程序是用 Java 编写的。FlatBuffer 的 Java 实现是否仍然很快,是否仍然是零分配/零解析?
我的 Java 应用程序将 Protobuf 消息存储在数据库中。该应用程序速度很快,但它可以变得更快,因为并非总是使用消息的所有部分,从而导致在不需要的数据上浪费 CPU 周期。此外,一些消息具有树状结构,导致分配的内存比我想要的要多。
在做了一些研究之后,FlatBuffers 似乎是一个不错的替代品,因为它声称它是零分配/零解析。但是,基准测试是针对 C++ 运行的。我的应用程序是用 Java 编写的。FlatBuffer 的 Java 实现是否仍然很快,是否仍然是零分配/零解析?
它试图尽可能接近零分配,但这并不完全可能。
例如,在 C++(和 C#)中作为值的访问器对象是 Java 中的分配。但是,它们可以在多个对象中重复使用,因此它们的成本可能很低,但代码复杂度更高。
更糟糕的是字符串,在 FlatBuffers 中是 UTF-8,但 Java 不直接支持 UTF-8。因此,如果您想以 a 的形式访问它,String
则必须对其进行转换和分配。您也可以将其作为 UTF-8 访问,ByteBuffer
但很少有 API 有用。
但是,如果不是数据的所有部分都被使用或增量使用,这仍然是一次解包/分配所有内容的巨大收益。
从库代码来看,解析和对象分配都是在属性访问时延迟发生的。
至于速度,我无法想象这比首先从数据库中获取数据要慢得多——但请随意对其进行基准测试:-)