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]

时间: 2024-09-19 08:49:46

Android 开发者应该使用 FlatBuffers 替代 JSON ?的相关文章

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

你可能会问,既然我们已经有很标准的JSON以及转换库比如GSON和Jackson,为什么还要使用新的工具呢? 不妨先试一下FlatBuffers,然后你就会发现它比JSON快得多. FlatBuffers是什么? FlatBuffers是一个高效的跨平台序列化类库,可以在C++.C#.C.Go.Java.JavaScript.PHP和Python中使用.是Google开发的,是为了应用在游戏开发,以及其他注重性能的应用上. 为什么要使用FlatBuffers? 不需要解析/拆包就可以访问序列化数

2015 年度 Android 开发者必备的 5 个开源库

本文讲的是2015 年度 Android 开发者必备的 5 个开源库, 在2014年6月,我们发表了一篇关于5 个顶级 Android 开源库的文章,我们一直在用,并且相信每个 Android 开发者都应该了解这些开源库.从那之后,Android 方面已经发生了很多变化,所以我们写了这篇文章,我们最喜欢的5个开源库的更新版. 下面是更新列表: 1. Retrofit 当涉及到实现 REST APIs 时,Retrofit 仍是我们的最爱. 他们的网站上写着: "Retrofit 将 REST A

Android 上的数据格式 FlatBuffers 介绍

本文讲的是Android 上的数据格式 FlatBuffers 介绍, JSON 格式 - 一个基本上人人知道的.轻量级的.并被现代服务器所广泛使用的数据格式.相对过时的.讨厌的 XML 数据格式来说,它量级轻.易于人们阅读.对开发人员也更为友好. JSON 是一种独立于语言存在的数据格式,但是它解析数据并将之转换成如 Java 对象时,会消耗我们的时间和内存资源.几天前,Facebook 宣称自己的 Android app 在数据处理的性能方面有了极大的提升.在几乎整个 app 中,他们放弃了

Android 开发者如何使用函数式编程 (二)

本文讲的是Android 开发者如何使用函数式编程 (二), 如果你没有读过第一部分,请到这里读: Android 开发者如何使用函数式编程 (一) 在上一篇帖子中,我们学习了纯粹性*.副作用和排序**.在本部分中,我们将讨论不变性和并发. 不变性 不变性是指一旦一个值被创建,它就不可以被修改. 假设我有一个像这样的 Car 类: public final class Car { private String name; public Car(final String name) { this.

Android开发者指南(10) —— Android API Levels

前言 本章内容为开发者指南(Dev Guide)/Appendix/Android API Levels,版本为Android3.0 r1,翻译来自:"jackeylu",欢迎大家访问他的博客:"http://jackeylu.wordpress.com/",再次感谢"jackeylu" !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://

Android开发者指南(25) —— Resource Types - Style

前言 本章内容为Android开发者指南的Framework Topics/Application Resources/Resource Types/Style章节,译为"样式资源",版本为Android 3.2 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆大虾" !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com.  

Android 开发者(Android Developer)

Android 开发者(Android Developer) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作.       Android 开发者(Android Developer)官方网站在

Android中gson、jsonobject解析JSON的方法详解_Android

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

Android开发者指南(22) —— Accessing Resources

前言 本章内容为Android开发者指南的Framework Topics/Application Resources/Accessing Resources章节,译为"资源调用",版本为Android 3.2 r1,翻译来自:"CodeGuy",欢迎访问他的博客:"http://www.cnblogs.com/CodeGuy/",再次感谢"CodeGuy" !期待你一起参与翻译Android的相关资料,联系我over140@