文档章节

为何 Android 开发者在逐渐用 FlatBuffers 替代 JSON

小贱1991
 小贱1991
发布于 2016/07/26 10:55
字数 1064
阅读 37
收藏 0

为何 Android 开发者在逐渐用 FlatBuffers 替代 JSON

一、FlatBuffers是什么?

  兄弟连教育www.lampbrother.net,FlatBuffers是一个高效的跨平台序列化类库,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google开发的,是为了应用在游戏开发,以及其他注重性能的应用上。

Android培训

二、为什么要使用FlatBuffers?

  不需要转义/拆包就可以访问序列化数据 — FlatBuffers与其他库不同之处就在于它使用二进制缓冲文件来表示层次数据,这样它们就可以被直接访问而不需转义与拆包,同时还支持数据结构进化(前进、后退兼容性)。

  内存高效速度快 — 访问数据时只需要访问内存中的缓冲区。它不需要多余的内存分配(至少在C++是这样,其他语言中可能会有变动)。FlatBuffers还适合配合mmap或数据流使用,只需要缓冲区的一部分存储在内存中。访问时速度接近原结构访问,只有一点延迟(一种虚函数表vtable),是为了允许格式升级以及可选字段。FlatBuffers适合那些花费了大量时间和空间(内存分配)来访问和构建序列化数据的项目,比如游戏以及其他对表现敏感的应用。可以参考这里的基准。

  灵活 — 由于有可选字段,你不但有很强的升级和回退兼容性(对于历史悠久的游戏尤其重要,不用为了每个版本升级所有数据),在选择要存储哪些数据以及设计数据结构时也很自由。

  轻量的code footprint — FlatBuffers只需要很少量的生成代码,以及一个表示最小依赖的很小的头文件,很容易集成。细节上可以看上面的基准页。

  强类型 — 编译时报错,而不需要自己写重复的容易出错的运行时检查。它可以自动生成有用的代码。

  使用方便 — 生成的C++代码允许精简访问与构建代码。还有可选的用于实现图表转义、类似JSON的运行时字符串展示等功能的方法。(后者比JSON转义库更快,内存效率更高)

  代码跨平台且没有依赖 — C++代码可以运行在任何近代的gcc/clang和VS2010上。同时还有用于测试和范例的构建文件(Android中.mk文件,其他平台是cmake文件)。

 

三、都有谁使用FlatBuffers?

兄弟连教育www.lampbrother.net 来带大家看看他们使用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完全卡住,所以真实使用时只能在后台线程进行转义。

© 著作权归作者所有

共有 人打赏支持
小贱1991
粉丝 1
博文 24
码字总数 25924
作品 0
昌平
私信 提问
Android 开发者应该使用 FlatBuffers 替代 JSON ?

你可能会问,既然我们已经有很标准的JSON以及转换库比如GSON和Jackson,为什么还要使用新的工具呢? 不妨先试一下FlatBuffers,然后你就会发现它比JSON快得多。 FlatBuffers是什么? FlatBu...

oschina
2016/07/11
10K
35
iOS中FlatBuffers的使用

文章首发于个人blog 欢迎指正补充,可联系lionsom_lin@qq.com 原文地址:iOS中FlatBuffers的使用 官方文档 GitHub - Google / flatbuffers FlatBuffer官网 iOS 相关Demo FlatBuffers-ObjC N...

lionsom_lin
2018/08/13
0
0
FlatBuffers 1.1 发布,序列化库

FlatBuffers 1.1 发布,此次版本发布主要有以下更新: an extensive overhaul to the Java API out-of-the-box support for C# and Go an optional verifier to make FlatBuffers practical ......

oschina
2015/04/03
2.2K
5
flatBuffer安装及使用教程

1、什么是flatBuffer: FlatBuffers为Google发布的一个跨平台,提供多种语言接口,注重性能和资源使用的序列化类库。目前该类库提供C++, C#, C, Go, Java, JavaScript, PHP, and Python语言接...

阿泽Aze
2018/05/30
0
0
TensorFlow Lite for Android 初探(附demo)

一. TensorFlow Lite TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案。TensorFlow Lite 支持 Android、iOS 甚至树莓派等多种平台。 我们知道大多数的 AI 是在云端运算的,但是...

fengzhizi715
2018/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
7
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部