安卓开发 FlatBuffers 能够替代 JSON 吗?

阅读 1451
收藏 45
2016-07-05
原文链接:www.sdk.cn

摘要:你也许会问:既然我们已经有了标准的JSON、GSON和Jackson,为何还要使用新的工具呢? 你不妨试试FlatBuffers,你就会发它们比JSON快多了。

FlatBuffers vs JSON

你也许会问:既然我们已经有了标准的JSON、GSON和Jackson,为何还要使用新的工具呢?

你不妨试试FlatBuffers,你就会发它们比JSON快多了。

FlatBuffers是什么?

FlatBuffers是一个跨平台标准化的C++、C#、C、Go、Java、JavaScript、PHP和Python库。它们最早由谷歌创立,用来开发游戏和其他一些需要高性能的程序。

为什么使用latBuffers?

无需分解/拆包就能使用序列化数据——FlatBuffers最大的特点,就是它可以在二进制文件缓冲区内代表分层数据,也就是说,在无需分解和拆包的情况下,它们就可以被使用,而且同时支持数据架构演变(支持向前和向后)。

内存效率与速度——获取数据所需的唯一内存,就是缓冲内存。它不需要任何额外的内存分配(至少在C++中不需要。其它语言可能会有所不同)。FlatBuffers还适用于mmap,内存只需要缓冲的一部分。数据使用的速度接近原架构,只需要一个额外的间接引用来允许格式演化和非强制性字段。FlatBuffers瞄准的是那些消耗大量时间和空间(许多许多的内存分配)的项目,它让这些项目可以使用或架构那些不受欢迎的序列号数据,例如FlatBuffers可以运用在游戏,或是其他需要消耗性能的应用中。

灵活性——拥有非强制性字段意味着你不仅可以获得优秀的前进和后退能力(在游戏中非常重要,你无需再每一个新版本中对所有数据都进行更新),还意味着你在数据写入和放弃方面,你拥有了更多的选择,在设计数据结构上面,你也有更多的选择。

对代码数量需求低——FlatBuffers只需要很少的代码,以及非常易于真核的单一小标题作为最小依赖。

编写简单——在使用的时候,错误在编写阶段就能体现出来,而不需要你进行反复的代码编写,也不需要进行运行时检查。它还会为你生成一些有用的代码。

使用方便——它所生成的C++代码便于访问,可用在结构代码中。它还有一个用于分解纲要的可选功能,以及类似JSON的文本表达功能,可以在运行时有效运转(相比JSON分解器速度更快,对内存的使用率也更高)。

跨平台,无依赖——C++代码可以兼容任何最近的gcc/clang和VS2010。它还内置了一个用于测试和样品的构建文件(安卓.mk文件,以及支持所有其他平台的cmake文件)。

是谁在使用FlatBuffers

BobbleApp是印度最受欢迎的表情贴纸应用。他们在使用FlatBuffers的过程中,大幅的提升了应用的性能。Cocos2d-x是排名第一的开源移动游戏引擎,他们也在使用Cocos2d-x来将游戏数据进行序列化处理。

Facebook也在使用FlatBuffers,他们用它来构建安卓应用中的客户服务沟通功能。他们曾经发布了一篇文章,讲述FlatBuffers对他们的帮助。

谷歌的Fun Propulsion Labs使用FlatBuffers在库和游戏的开发中大量使用FlatBuffers。

应用性能有多大的提升?

分解速度方面,在JSON上处理20KB的数据需要35毫秒,超过了UI框架刷新的间隔(16.6毫秒)。在使用JSON的时候,我们无法给用户带来顺滑的应用体验,他们在滚动UI的时候,会感到明显的延迟。

分解初始化方面。JSON的分解器需要在分解前构建field mapping,通常需要100-200毫秒。这会大大延长应用的启动时间。

垃圾收集方面,在JSON进行分解的过程中,会产生大量小对象,我们发现,当JSON对20KB的数据进行分解的时候,需要为其指派100KB的内存空间,这个Java的垃圾收集器造成了巨大的压力。

FlatBuffer vs JSON

我曾经做过这样的实验,分别用FlatBuffer和JSON对4mb的文件进行分解,FlatBuffer需要1-5毫秒,而JSON需要2000毫秒。在使用FlatBuffer的时候,应用无需调用GC;而在使用JSON的时候,GC需要被调用多次。因此,在使用JSON的时候,应用UI冻结,我只能选在在背景中让JSON完成分解。

 

示例应用截图

原    文:Why Android developers should consider FlatBuffers over JSON
译    文:SDK.cn
作    者:Christian(编译)
评论