文档章节

为何 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
昌平
私信 提问
iOS中FlatBuffers的使用

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

lionsom_lin
08/13
0
0
flatBuffer安装及使用教程

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

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

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

fengzhizi715
11/07
0
0
有道云笔记是如何使用TensorFlow Lite的?

文 / 有道技术团队 近年来,有道技术团队在移动端实时 AI 能力的研究上,做了很多探索及应用的工作。2017 年 11 月 Google 发布 TensorFlow Lite (TFLlite) 后,有道技术团队第一时间跟进 TF...

谷歌开发者
04/21
0
0
Protobuf 作者不建议在 Deno 中使用 Protobuf

0. 背景 我之前在"如何评价ry(Ryan Dahl)的新项目deno?"的回答中曾经写到: 我比较好奇的是 deno 使用了 Protobuf,而没有使用 Mojo。既然目标是要兼容浏览器,却不使用 Mojo... ... 但是从 ...

justjavac
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt那些事0.0.9

关于QThread,无F*k说的。文档说的差不多,更多的是看到很多人提到Qt开发者之一的“你TM的做错了(You're doing it wrong...)”,这位大哥2010年写的博客,下面评论很多,但主要还是集中在2...

Ev4n
29分钟前
1
0
constructor / destructor

_attribute__表示属性,是Clang提供的一种源码注释,方便开发者向编译器表达诉求,一般以__attribute__(*)的方式出现在代码中。为了方便使用,一些常用属性被定义成了宏,经常出现在系统头文...

HeroHY
29分钟前
1
0
大数据教程(7.6)shell脚本定时采集日志数据到hdfs

上一篇博客博主分享了hadoop内置rpc的使用案例,本节博主将为小伙伴们分享一个在实际生产中使用的日志搜集案例。前面的文章我们有讲到过用户点击流日志分析的流程,本节就是要完成这个分析流...

em_aaron
58分钟前
1
0
wave和pcm互转

wav->pcm pcm->wav c#代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using Sys......

whoisliang
今天
1
0
Win10:默认的图片打开应用,打开图片时速度明显很慢的解决办法

首先,我们随便地打开一张图片。然后,点击右上角的三个小点,最后点击弹出菜单最下面的“设置”。如下图: 在“设置”中找到下面的“人物”,把它关掉就好了。 原来,默认情况下,Win 10的图...

LivingInFHL
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部