写点什么

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

  • 2016-07-07
  • 本文字数:1584 字

    阅读完需:约 5 分钟

你可能会问,既然我们已经有很标准的 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。

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


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-07-07 19:009395

评论

发布
暂无评论
发现更多内容

Notebook交互式完成目标检测任务

华为云开发者联盟

人工智能

orbeon form 的配置介绍

汪子熙

angular SAP commerce form 9月月更

Vue3入门指北(三)ref和reactive

Augus

Vue 9月月更

本地生活与小程序技术融合迎战增量市场

Onegun

小程序 小程序容器 本地生活

MobSDK 快速集成文档

MobTech袤博科技

Android Studio an'droid

heco火币生态链智能合约dapp系统开发案例,合约部署

开发微hkkf5566

原生Redis跨数据中心双向同步优化实践

京东科技开发者

数据中心 幂等性 同步 数据容灾 Redis 数据结构

当面试官问你:如何才能带领好团队?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Web自动化之显式等待与隐式等待

测吧(北京)科技有限公司

OpenHarmony主干开发板家族新添两成员,主干开发板数达20款

科技热闻

如何使用 eunomia 让eBPF 的部署更简单? | 第 49 期

OpenAnolis小助手

Linux 直播 ebpf sig 龙蜥大讲堂

软件测试 | 测试开发 | 测试面试真题|从手工到测开,一位测试媛宝妈的 BAT 大厂逆袭之旅

测吧(北京)科技有限公司

测试

瓜分 28 万现金大奖,Tapdata 数据源 Connector 大赛等你来战!

tapdata

开源 开发者 开源项目 挑战赛

必修课!深度解析金融级分布式数据库一致性技术

腾讯云数据库

数据库 腾讯云 tdsql 腾讯云数据库

软件测试 | 测试开发 | 测试面试 | 某个版本/模块问题很多,但上线时间紧迫怎么办?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试面试 | 某互联网大厂测试面试真题,你能回答出多少?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | web 控件的交互进阶

测吧(北京)科技有限公司

测试

点赞破百万!字节算法大佬亲撰30W字数据算法笔记:GitHub标星93K

程序知音

Java 数据结构 数据结构与算法 后端技术

议题征集:NGINX Sprint China 2022 线上大会

NGINX开源社区

nginx 开源软件 Sprint

如何通过 Nginx 解决跨域问题

观测云

软件测试 | 测试开发 | Web 控件定位与常见操作

测吧(北京)科技有限公司

测试

IaC 存储最佳实践

SEAL安全

DevOps 基础设施 DevSecOps 基础设施即代码 IaC

百度工程师带你探秘C++内存管理(理论篇)

百度Geek说

c++ Linux 开发语言 企业号九月金秋榜

Struts 校验器(Validate)

表单校验 Struts2 9月月更

Vue3入门指北(二)创建应用实例

Augus

Vue 9月月更

Vue3入门指北(四)computed (计算属性)

Augus

Vue 9月月更

EasyNLP带你实现中英文机器阅读理解

阿里云大数据AI技术

自然语言处理 深度学习 PyTorch 企业号九月金秋榜

软件测试 | 测试开发 | 网页 frame 与多窗口处理

测吧(北京)科技有限公司

测试

最高增强至1440p,阿里云发布端侧实时超分工具,低成本实现高画质

阿里云大数据AI技术

机器学习 企业号九月金秋榜

本周四晚19:00知识赋能第八期第3课丨涂鸦小游戏的实现

OpenHarmony开发者

OpenHarmony

沉舟侧畔千帆过 | 高德的OceanBase Cloud实践之路

followtry

最佳实践 分布式数据库 数据库迁移 oceanbase

为什么Android开发者应该使用FlatBuffers替代JSON?_Android/iOS_Amit Shekhar_InfoQ精选文章