FlatBuffers初探
我第一次知道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初探相关推荐
- 多维数组的行优先和列优先, 数据描述语言
多维数组的行优先和列优先 这里以numpy为工具,介绍一下多维数组的行优先和列优先的概念. 首先我们生成一个3x4的数组: arr = np.arange(12).reshape(3,4) 它的形状是 ...
- 2021年大数据Flink(九):Flink原理初探
Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...
- 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...
引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...
- 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武
1.来源:<网络表征学习前沿与实践> 崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...
- python argparse_Python 命令行之旅:初探 argparse
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...
- HTML5+MUI+HBuilder 之初探情人
07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...
- 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探
2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...
最新文章
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
- mysql where in 中多个参数查询
- ARM处理器的工作状态
- 辽宁省普通话水平测试软件,辽宁普通话水平测试报名入口
- boost::function/bind
- 强化简书社交属性,淡化官腔官调
- UE4官方文档毛发部分整合笔记
- go1.15版本 mod 报An existing connection was forcibly closed by the remote host错误处理
- UML用例图中三种关系详解
- android qq skype,蓝牙耳机与IVT组合实现在电脑聊天、打电话(QQ、Skype)
- [一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”
- 五个角度浅析大数据与BI的区别
- CSS使用小操作(隐藏滚动,实现三角行等...)
- 深度学习中的数据增强(上)
- Word的样式库在 选项卡中_word排版应用:如何创建文本样式和表格样式
- antdesign+vue额外展开行expandedRowRender全部展开,并隐藏expandIcon展开收起按钮;antdesign表格嵌套表格
- js 百度地图标记定位(一)
- web前端开发工程师是做什么工作的?
- 定义python函数时如果函数中没有return语句_定义Python函数时,如果函数中没有return语句,则默认返回空值None。...
- difflib模块_Python一起来找茬—difflib模块
热门文章
- 未来区块链技术将赋能多个领域促进全球经济发展
- 使用hexo搭建个人博客
- bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined
- 无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...
- 单页面应用微信分享跳坑指南
- [20170606]11G _optimizer_null_aware_antijoin.txt
- handler消息机制
- Binary Tree Preorder Traversal LeetCode OJ
- 解决SecureCRT连接GNS3时SecureCRT标签窗口同名的问题
- yum lock 解决方法