📌  相关文章
📜  为什么 Android 开发人员应该考虑使用 JSON 上的 FlatBuffers?

📅  最后修改于: 2022-05-13 01:58:44.785000             🧑  作者: Mango

为什么 Android 开发人员应该考虑使用 JSON 上的 FlatBuffers?

FlatBuffers 以跨平台的方式将序列化数据保存在缓冲区中,允许通过完全向前和向后兼容的模式进行格式演变。这些缓冲区可以保存在文件中或以其原始形式通过网络传输,并且可以在没有任何处理成本的情况下就地访问它们。那么,究竟什么是平面缓冲区?你可能会问

使用平面缓冲区

事不宜迟,让我们直接深入探讨为什么作为 Android 开发人员使用 Flat Buffers over JSON 的主题。嗯,这个问题的答案很简单,因为它分为几点:

  • 在不实际解析的情况下获取数据访问——FlatBuffers 的区别在于它们在平面二进制缓冲区中表示分层数据,允许直接访问而无需解析和解包,同时仍提供数据结构开发(向前/向后兼容性)。
  • 性能更好——缓冲区是访问数据所需的唯一内存。它不需要额外的分配(至少在 C++ 中不需要)。其他语言可能不同)。 FlatBuffers 也非常适合与mmap (或流)一起使用,因为只需要缓冲区的一部分驻留在内存中。
  • 延展性——拥有可选字段意味着您不仅可以获得出色的向前和向后兼容性(这对于长期存在的游戏越来越重要:您不必在每个新版本中更新所有数据),而且您还可以获得出色的向前和向后兼容性兼容性。这也意味着您在编写哪些数据、不编写哪些数据以及如何构建数据结构方面有很大的自由度。
  • FlatBuffers只需要少量生成的代码和一个短标题作为最低要求,这使得它们非常易于合并。有关更多信息,请参阅基准部分。
  • 鲁棒性和刚性——在编译时捕获错误,而不必手动执行重复且容易出错的运行时检查。您可能会为您生成有用的代码。
  • 易于使用——生成的 C++ 代码提供了简洁的访问和构造代码。如果需要,还有用于解析模式和在运行时运行类似 JSON 的文本表示的可选功能(比其他 JSON 解析器更快,内存效率更高)。
  • C++代码是跨平台的,没有依赖;它适用于任何当前的 GCC/clang 和 VS2010。它包括测试和示例的构建文件(Android .mk 文件和所有其他平台的 cmake)。

在经历了上述优势之后,现在可以提出以下要求:

如果我使用平面缓冲区,会有多少性能提升?

使用平面缓冲区时会获得整体性能提升,但是,它也取决于用例,如果您使用大量使用自动生成存根的代码,那么您肯定会在以下方面获得:

  • 解析速率。解析一个 10 KB(典型响应大小)的 JSON 流需要 20 毫秒,这比 16.6 毫秒的 UI 帧刷新周期要快。在使用这种技术滚动时,我们无法从磁盘缓存中按需加载数据而不会出现丢帧(视觉卡顿)。

启动解析恶魔——你可能使用的任何现代 JSON 解析器都需要一些时间来初始化自身,把它想象成一辆两轮车,在你静止一段时间后才能真正骑上它之前需要时间加热,这可能需要 200 毫秒到 400 毫秒,显着减慢应用程序启动时间。

  • 垃圾收集。在 JSON 解析过程中,会生成许多微小的对象,在我们的测试中,在处理 10 KB 的 JSON 流时分配了超过 50 KB 的临时内存,这给Java垃圾收集器带来了巨大的压力。

现在使用 Flat Buffer 会被证明是一个更好的想法,所以

谁使用平面缓冲区?

Flat Buffers 的用例巨大且潜力巨大,因此各种开发人员倾向于在他们的项目中使用 FB,包括(不限于):

  1. 谷歌——当然,正如他们开发的那样,在各种不同的产品中使用它,这里提到了。
  2. Tabnine — Flat Buffer 的另一个用户,以不同的复古风格使用它,可以在这里找到。
  3. Facebook——这家社交巨头在 JSON 上使用 Flat Burner 来提高可靠性和速度,更多信息可以在这里找到。

FlatBuffers 架构编译器和运行时是内置的独立于平台的 C++,在 STL 之外没有库要求,允许它们在任何支持 C++ 编译器的平台上使用。模式编译器可以创建 C++ 和Java代码来读取和写入 FlatBuffers 二进制文件。它还可以解析 JSON 格式的数据并将其转换为类型安全的二进制文件。

结论和速度检查

凭借 Flat Buffers 带来的所有性能、速度和其他改进,无疑使它成为代替 JSON 的更好选择,JSON 现在也随着它的发展而老化现在慢慢开始显示问题。

如果您仍然需要迁移的理由,这里有一个实际用例,我们看到 FB 的性能优于 JSON。 FlatBuffer 用了 1-3 毫秒,而 JSON 用了大约 1990 毫秒。并且在 FlatBuffer 使用期间,Android 应用程序中没有调用 GC。但是在使用 JSON 时,GC 被调用了很多次。结果,用户界面变得迟钝,有时反应迟钝,使用户感到不安。