Android 开发者应该使用 FlatBuffers 替代 JSON ?
你可能会问,既然我们已经有很标准的JSON以及转换库比如GSON和Jackson,为什么还要使用新的工具呢?
不妨先试一下FlatBuffers,然后你就会发现它比JSON快得多。
FlatBuffers是什么?
FlatBuffers是一个高效的跨平台序列化类库,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google开发的,是为了应用在游戏开发,以及其他注重性能的应用上。
为什么要使用FlatBuffers?
不需要解析/拆包就可以访问序列化数据 — FlatBuffers与其他库不同之处就在于它使用二进制缓冲文件来表示层次数据,这样它们就可以被直接访问而不需解析与拆包,同时还支持数据结构进化(前进、后退兼容性)。
内存高效速度快 — 访问数据时只需要访问内存中的缓冲区。它不需要多余的内存分配(至少在C++是这样,其他语言中可能会有变动)。FlatBuffers还适合配合 mmap或数据流使用,只需要缓冲区的一部分存储在内存中。访问时速度接近原结构访问,只有一点延迟(一种虚函数表vtable),是为了允许格式升级以 及可选字段。FlatBuffers适合那些花费了大量时间和空间(内存分配)来访问和构建序列化数据的项目,比如游戏以及其他对表现敏感的应用。可以参 考这里的基准。
灵活 — 由于有可选字段,你不但有很强的升级和回退兼容性(对于历史悠久的游戏尤其重要,不用为了每个版本升级所有数据),在选择要存储哪些数据以及设计数据结构时也很自由。
轻量的code footprint — FlatBuffers只需要很少量的生成代码,以及一个表示最小依赖的很小的头文件,很容易集成。细节上可以看上面的基准页。
强类型 — 编译时报错,而不需要自己写重复的容易出错的运行时检查。它可以自动生成有用的代码。
使用方便 — 生成的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。
文章转载自 开源中国社区[http://www.oschina.net]
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 将可以按地点自动启动应用程序
Google真的真的希望我们能按特定条件来使用某些应用程序内容,因为在 Google Android Blog 的一篇文章中,说明了 Nearby 功能可让 Android 装置利用蓝牙和 GPS 来判定身处位置后,自动执行某些动作的例子,包括当装置得知自己身处机场时,就会自动显示登机所需要的资料;在药房的话,就会自动显示所需要买的东西的照片或打印药单。原理有点像 IF 的按位置触发条件,只是变了在系统内建的功能。 Nearby 功能已经随最新的 Google Play Services 推送至各装置上,并能让 KitKat 或以上版本使用。有了这样的功能,手机就能有如配合实体蓝牙 beacon 般来接收不同的资讯,感觉既方便又扰人呢... 真矛盾。 文章转载自 开源中国社区[http://www.oschina.net]
- 下一篇
iOS 与 Android 全球份额差距正越拉越大
今年第一季 iOS 当前仅剩 13.7% 市场份额,而 Android 占比高达 86.1%。 日前,市场调研机构发布了 2017 年第一季度智能手机追踪报告,通过该报告我们了解到,苹果依然是目前全球第二大智能手机厂商,iPhone 所占的市场份额为 13.7%。不过,从设备出货量而言,其实相当于苹果正遭受群攻。因为在整个智能手机市场,无非就是 Android 和 iOS 之间的争夺战。那么,两者之间的战况目前如何呢? Gartner 的数据显示,苹果 iOS 操作系统设备 2017年出货量为 5199.25 万,相比之下 Android 设备的出货量高达 3.271 亿。若换成市场份额,iOS 当前仅剩下 13.7% 的市场份额,而 Android 占比高达 86.1%。 Gartner 表示,Android 依然保持移动市场的统治级地位,主要得益于中国品牌手机的突出表现,2017 年第一季度市场份额出现了 2% 的涨幅。相反,iOS 系统则出现了 1.1% 的跌幅。 从过去 Gartner 的报告来看,iOS 操作系统的市场份额每况愈下,已经连续两年出现下滑的情况了,近三年来的高峰...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群