【问题标题】:Is the Java implementation for FlatBuffer's zero-allocation?FlatBuffer的零分配是Java实现吗?
【发布时间】:2017-05-25 00:49:49
【问题描述】:

我的 Java 应用程序将 Protobuf 消息存储在数据库中。该应用程序很快,但它可以变得更快,因为并非总是使用消息的所有部分,从而导致 CPU 周期浪费在不需要的数据上。此外,一些消息具有树状结构,导致分配的内存超出我的预期。

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

【问题讨论】:

    标签: java flatbuffers


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      但是,如果不是数据的所有部分都被使用或增量使用,这仍然比一次解包/分配所有内容的巨大收益。

      【讨论】:

      • 可能值得补充的是,现代 JVM 执行转义分析,如果对象没有转义调用堆栈帧,则可能会在堆栈上分配对象。因此,重用对象不一定更快,实际上可能会由于缓存未命中率增加而变慢。
      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多