OceaBase开发者大会落地上海!4月20日共同探索数据库前沿趋势!报名戳 了解详情
写点什么

为什么 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:008136

评论

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

GTC 2023的算力协奏曲,NVIDIA与宁畅“共舞”AI时代

脑极体

算力

华为Mate X3震撼发布!轻薄折叠屏携华为阅读带来全新精品阅听体验

最新动态

什么是远程控制软件?远程控制软件推荐

RayLink远程工具

远程控制软件

2023 年最佳免费远程控制软件RayLink-远程办公必备

RayLink远程工具

远程控制软件 远程办公软件

低代码实现探索(五十七)脚本模板模式的生成

零道云-混合式低代码平台

远程桌面连接是什么?远程桌面连接使用教程

RayLink远程工具

内网渗透之某后渗透利用

网络安全学海

黑客 网络安全 安全 信息安全 渗透测试

中国量子产业集结,用知识产权助力量子应用化

脑极体

Securtiy Code Reviewer 需要做些什么?6个安全实例一探究竟

极狐GitLab

DevOps Code Review 代码质量 代码安全 代码评审

时不我待,拥抱趋势,开源IM项目OpenIM技术简介

Geek_1ef48b

远程桌面和远程协助的区别,选择哪个方式连接更好?

RayLink远程工具

远程协助 远程桌面连接

远程桌面连接如何设置?远程桌面连接的设置方法

RayLink远程工具

远程桌面连接

DrawerLayout(官方侧滑菜单)的简单使用

二哈侠

ViewPager DrawerLayout SlidingMenu

什么是远程桌面?远程桌面软件是如何进行连接工作的?

RayLink远程工具

远程桌面连接 远程桌面工具 远程桌面软件

远程控制软件RayLink助力畅玩爆火双人游戏

RayLink远程工具

远程控制软件

紧跟潮流,抓住趋势,跟上全民AI的节奏,开源IM项目OpenIM产品介绍,为AIGC贡献力量

Geek_1ef48b

远程控制软件如何实现两台电脑连接

RayLink远程工具

远程控制软件

免费的远程控制软件有哪些?远程控制软件哪个好用?

RayLink远程工具

远程控制软件 远控软件

ChatGPT编程秀-2:最小元素的设计

仝键

JavaScript 编程 架构 java ChatGPT

远程桌面连接有哪些方式?远程桌面工具推荐

RayLink远程工具

远程桌面连接 远程桌面工具

华为全新发布2023春季旗舰新品,智慧生活再进化

最新动态

如何远程控制电脑,远程控制电脑的设置方法

RayLink远程工具

远程控制连接 远程控制电脑

好用的远程控制桌面连接工具有哪些?

RayLink远程工具

远程桌面连接

GPT-4正刮起新的生成式AI风暴

澳鹏Appen

人工智能 ChatGPT GPT-4

大数据分析工具Power BI(六):DAX表达式简单运用

Lansonli

大数据分析工具Power BI

电脑怎么远程连接服务器?如何进行远程桌面连接?

RayLink远程工具

远程桌面连接

给程序加个进度条吧!1行Python代码,快速搞定~

程序员晚枫

Python pip 进度条

【必看答疑】为什么我的电脑远程连接不上?

RayLink远程工具

远程桌面连接

远程办公模式开启,该如何选择合适的办公软件?

RayLink远程工具

远程办公 远程协助 远程办公软件

华为春季发布会召开,旗舰新品全面支持空间音频

最新动态

官宣|Apache Flink 1.17 发布公告

Apache Flink

大数据 flink 实时计算

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