我第一次知道FlatBuffers是因为Facebook写的这篇Android的技术博客文章。它主要介绍了FlatBuffers对比JSON的优势,以及Facebook Android App应用了FlatBuffers后,衍生的数据和界面更新的工作流转模式。建议去读一读,作者还是一个中国人哦。

下面开始介绍了一下FlatBuffers,首先看看它和JSON的对比。

   

先引用GitHub frogermcs/FlatBuffs上的两张Gif效果图.

那个Loading菊花是干什么的呢?点击上下两个按钮开始数据解析,而数据解析是故意放在主线程上执行,而Loading菊花能直观的辨别解析过程有没有导致UI卡顿。

左图,点击"PARSE JSON"按钮是用的Gson解析了一个468KB的Json文件,耗时200-300ms。

右图,点击"USE FLATBUFFERS",是“解析”同样的Json数据但是用FlatBuffers特有的数据格式文件repos_flat.bin。耗时是<10ms。FlatBuffers“解析”的过程,Loading菊花一直保持着流畅的转动。

FlatBuffers到底有什么样的魔术,能比JSON快这么多呢?

其实FlatBuffers实际并没有做数据的解析,repos_flat.bin是按照FlatBuffers数据组织格式生成的Byte数组。

FlatBuffer的数据解析是靠一层层的offset偏移量的组合计算定位到数据在Byte数组的位置,进而获取目标数据的值 。所以FlatBuffer是需要什么数据,才解析什么数据,并不需要全量解析。

简单说,FlatBuffers分为vtable区和数据区。vtable区保存的是数据的偏移值,数据区保存的是具体的数据值。

FlatBuffers的优点和缺点

优点:

1. 数据都是从Byte数组中获取,减少解析过程的内存占用,减低了GC发生概率。

Memory Efficient Serialization Library,FlatBuffers是这么描述自己的。

这里有别人做的内存检测的数据。

2. 无需全量解析,用到的数据才需要解析。

想象一个很长的ListView,并不需要在初始状态就把所有的数据都解析出来。滚动到可见状态的item的数据,才需要被解析。

缺点:

1. 数据获取都是偏移量计算的解析过程,嵌套层级深的数据,可能带来性能问题。

2. 不自行做数据缓存的话,每次获取同样的数据会有重复计算。

3. Byte数据安全性和完整性有顾虑。也有人专门写博客表明不会用FlatBuffer哈哈。

FlatBuffers的应用

FlatBuffers还可以“解析”JSON,实际是把JSON数据生成FlatBuffers格式的Byte数组。

如上图,中间的按钮“PARSE JSON(FLATBUFFERS)”点击执行后解析468KB同样的JSON文件,比Gson节省了约40%的耗时。

作为应用FlatBuffers的切入点,参考着的frogermsc GitHub Demo,我尝试把FlatBuffer解析JSON应用到工作项目中。

步骤:

1. 使用FlatBuffers需要引入2个SO和一个JAR,合计1MB;

2. 根据待解析的数据,要写一个schema文件如下,类似于protocolBuffer的.proto文件的作用;

namespace RankDetail;table RankDetail {code : int;msg : string;
}root_type RankDetail;

3. 通过命令行,根据schema生成相关解析后数据读取的Java类,这个步骤也类似protocolBuffer;

遇到的问题:

1. schema文件的Key-value对的Key不能数字开头,如下的123key是不符合要求的;

原因是因为,FlatBuffers是直接获取schema文件内的这种key-value的key的值作为方法名字和变量名字,阿拉伯数字开头的变量名和方法名是不合法的。

namespace RankDetail;table RankDetail {code : int;msg : string;123key : string;
}root_type RankDetail;

2. 解析是在SO的native代码,遇到失败就会native crash,缺少有用的解析失败的日志信息,增加开发调试的难度和时间。

FlatBuffers最大的威力是解析他自家格式的Byte数组(参考文章开头的GIF对比),应用到正式环境的功能,需要后台请求返回的数据是FlatBuffers格式的Bytes数组。另外,FlatBuffers解析的容错性目前还有待完善提升。但以后,FlatBuffers会是减少内存占用、提升用户体验的利器。

转载于:https://www.cnblogs.com/wingyip/p/5185593.html

FlatBuffers初探相关推荐

  1. 多维数组的行优先和列优先, 数据描述语言

    多维数组的行优先和列优先 这里以numpy为工具,介绍一下多维数组的行优先和列优先的概念. 首先我们生成一个3x4的数组: arr = np.arange(12).reshape(3,4) 它的形状是 ...

  2. 2021年大数据Flink(九):Flink原理初探

    Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...

  3. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  4. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  5. las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...

    引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...

  6. 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武

    1.来源:<网络表征学习前沿与实践>  崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...

  7. python argparse_Python 命令行之旅:初探 argparse

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...

  8. HTML5+MUI+HBuilder 之初探情人

    07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...

  9. 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探

    2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...

最新文章

  1. Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
  2. mysql where in 中多个参数查询
  3. ARM处理器的工作状态
  4. 辽宁省普通话水平测试软件,辽宁普通话水平测试报名入口
  5. boost::function/bind
  6. 强化简书社交属性,淡化官腔官调
  7. UE4官方文档毛发部分整合笔记
  8. go1.15版本 mod 报An existing connection was forcibly closed by the remote host错误处理
  9. UML用例图中三种关系详解
  10. android qq skype,蓝牙耳机与IVT组合实现在电脑聊天、打电话(QQ、Skype)
  11. [一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”
  12. 五个角度浅析大数据与BI的区别
  13. CSS使用小操作(隐藏滚动,实现三角行等...)
  14. 深度学习中的数据增强(上)
  15. Word的样式库在 选项卡中_word排版应用:如何创建文本样式和表格样式
  16. antdesign+vue额外展开行expandedRowRender全部展开,并隐藏expandIcon展开收起按钮;antdesign表格嵌套表格
  17. js 百度地图标记定位(一)
  18. web前端开发工程师是做什么工作的?
  19. 定义python函数时如果函数中没有return语句_定义Python函数时,如果函数中没有return语句,则默认返回空值None。...
  20. difflib模块_Python一起来找茬—difflib模块

热门文章

  1. 未来区块链技术将赋能多个领域促进全球经济发展
  2. 使用hexo搭建个人博客
  3. bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined
  4. 无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...
  5. 单页面应用微信分享跳坑指南
  6. [20170606]11G _optimizer_null_aware_antijoin.txt
  7. handler消息机制
  8. Binary Tree Preorder Traversal LeetCode OJ
  9. 解决SecureCRT连接GNS3时SecureCRT标签窗口同名的问题
  10. yum lock 解决方法