为何Android开发者应该使用FlatBuffers替代JSON?

你可能会问,既然咱们已经有很标准的JSON以及转换库好比GSON和Jackson,为何还要使用新的工具呢?html

不妨先试一下FlatBuffers,而后你就会发现它比JSON快得多。android

FlatBuffers是什么?git

FlatBuffers是一个高效的跨平台序列化类库,能够在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google开发的,是为了应用在游戏开发,以及其余注重性能的应用上。github

为何要使用FlatBuffers?json

  • 不须要解析/拆包就能够访问序列化数据 — FlatBuffers与其余库不一样之处就在于它使用二进制缓冲文件来表示层次数据,这样它们就能够被直接访问而不需解析与拆包,同时还支持数据结构进化(前进、后退兼容性)。缓存

  • 内存高效速度快 — 访问数据时只须要访问内存中的缓冲区。它不须要多余的内存分配(至少在C++是这样,其余语言中可能会有变更)。FlatBuffers还适合配合mmap或数据流使用,只须要缓冲区的一部分存储在内存中。访问时速度接近原结构访问,只有一点延迟(一种虚函数表vtable),是为了容许格式升级以及可选字段。FlatBuffers适合那些花费了大量时间和空间(内存分配)来访问和构建序列化数据的项目,好比游戏以及其余对表现敏感的应用。能够参考这里的基准数据结构

  • 灵活 — 因为有可选字段,你不但有很强的升级和回退兼容性(对于历史悠久的游戏尤为重要,不用为了每一个版本升级全部数据),在选择要存储哪些数据以及设计数据结构时也很自由。app

  • 轻量的code footprint — FlatBuffers只须要不多量的生成代码,以及一个表示最小依赖的很小的头文件,很容易集成。细节上能够看上面的基准页。ide

  • 强类型 — 编译时报错,而不须要本身写重复的容易出错的运行时检查。它能够自动生成有用的代码。函数

  • 使用方便 — 生成的C++代码容许精简访问与构建代码。还有可选的用于实现图表解析、相似JSON的运行时字符串展现等功能的方法。(后者比JSON解析库更快,内存效率更高)

  • 代码跨平台且没有依赖 — C++代码能够运行在任何近代的gcc/clang和VS2010上。同时还有用于测试和范例的构建文件(Android中.mk文件,其余平台是cmake文件)。

都有谁使用FlatBuffers?

  • BobbleApp,印度第一贴图App。咱们在BobbleApp中使用FlatBuffers后App的性能明显加强。

  • Cocos2d-x,第一开源移动游戏引擎,使用FlatBuffers来序列化全部的游戏数据。

  • Facebook使用FlatBuffers在Android App中进行客户端服务端的沟通。他们写了一篇文章来描述FlatBuffers是如何加速加载内容的。

  • Google的Fun Propulsion Labs在他们全部的库和游戏中大量使用FlatBuffers。

App性能有多大提升?

  • 解析速度 解析一个20KB的JSON流(这差很少是BobbleApp的返回大小)须要35ms,超过了UI刷新间隔也就是16.6ms。若是解析JSON的话,咱们就在滑动时就会由于要从磁盘加载缓存而致使掉帧(视觉上的卡顿)。

  • 解析器初始化 一个JSON解析器须要先构建字段映射再进行解析,这会花100ms到200ms,很明显的拖缓App启动时间。

  • 垃圾回收 在解析JSON时建立了不少小对象,在咱们的试验中,解析20kb的JSON流时,要分配大约100kb的瞬时存储,对Java内存回收形成很大压力。

FlatBuffers vs JSON

我尝试使用FlatBuffers和JSON解析4mb的JSON文件。

FlatBuffers花了1-5ms,JSON花了大约2000ms。在使用FlatBuffers期间Android App中没有GC,而在使用JSON时发生了不少次GC。在使用JSON时UI彻底卡住,因此真实使用时只能在后台线程进行解析。

如何使用FlatBuffer呢?

我在个人GitHub中写了一个示例,里面手把手教你如何使用FlatBuffer。

原文连接:https://medium.freecodecamp.com/why-consider-flatbuffer-over-json-2e4aa8d4ed07

相关文章
相关标签/搜索