为何 Android 开发者在逐渐用 FlatBuffers 替代 JSON
一、FlatBuffers是什么?
兄弟连教育www.lampbrother.net,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?
兄弟连教育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完全卡住,所以真实使用时只能在后台线程进行转义。
分享到:
相关推荐
Android开发者资料大全
在Android应用开发中,有时我们需要从本地存储的JSON文件中读取数据,这通常涉及到文件I/O操作和字符编码处理。以下将详细讲解如何在Android中读取本地JSON文件,并解决可能出现的显示乱码问题。 1. **读取本地JSON...
"Android-okhttp-json-mock"是一个专门为OkHttp和Retrofit设计的测试工具,它允许开发者在本地模拟返回json格式的网络数据,极大地提高了开发和测试的效率。这个工具的核心功能在于,它能够拦截OkHttp的网络请求,并...
在Android中,我们可以使用内置的`org.json`库解析JSON字符串。解析后的数据可以转化为`JSONObject`和`JSONArray`对象,便于进一步操作。为了展示JSON数据,我们需要创建一个自定义的布局来呈现键值对,并根据需要...
在Android开发中,Android Studio是官方推荐的集成开发环境(IDE),它提供了强大的工具和功能,使得开发者可以高效地创建Android应用。在这个场景中,我们将探讨如何在Android Studio中解析JSON数组,并将获取的...
在Java中,我们可以使用`org.json`库或者Gson库将Map转换为JSON字符串。这个工具类可能包含以下方法: ```java public static String mapToJsonString(Map, Object> map) { // 使用Gson库进行转换 Gson gson = ...
《Android中文API合集(7)》与《Android开发者指南(2)》是两本针对Android开发者的宝贵资源,它们以CHM(Compiled Help Manual)格式提供,方便开发者离线查阅。下面将对这两个资源中的关键知识点进行详细的阐述...
- 对于简单的JSON解析,可以使用Android SDK内置的`org.json`库。 - 对于大量数据或性能敏感的应用,推荐使用Gson或其他高性能库。 - 性能优化时,考虑使用流式解析(Streaming API)以减少内存消耗。 - 使用try-...
在Android开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人和机器都能容易地阅读和编写。JSON数据的读写是Android应用开发中的常见任务,尤其是在进行网络通信、数据存储或者数据...
JsonView是一款针对Android平台设计的高效Json解析和可视化工具,它为开发者提供了一种直观的方式来查看和理解Json数据。在Android应用开发过程中,处理Json数据是常见的任务,而JsonView通过其友好的界面和强大的...
在"Android_JSON.zip"这个压缩包中,很可能是包含了一些关于在Android中使用JSON进行数据解析的示例代码或教程。 在Android中,JSON数据通常用于与服务器进行通信,如通过HTTP请求获取API接口返回的数据。这些数据...
2. **JSON在JNI中的应用**:为了在Java和C++之间传递JSON数据,通常需要将JSON字符串作为参数传入JNI函数,然后在C++端解析这个字符串。可以使用开源库如`nlohmann/json`在C++中处理JSON。 3. **数据转换**:在Java...
本资源"安卓Android源码——android访问网络返回json解析和Hanlder的使用.zip"聚焦于两个核心概念:网络请求与数据解析,以及Handler的使用。我们将深入探讨这两个方面。 首先,Android中的网络访问是应用程序与...
本教程将深入讲解如何在Android中对JSON数据进行封装和解析,以便于在应用程序中有效使用。 一、JSON基础知识 JSON是一种独立于语言的数据表示格式,它基于ECMAScript的一个子集。一个基本的JSON对象由键值对组成,...
在“Android解析json速度对比”的测试中,我们通常会设置一个标准的JSON数据集,然后使用这三个库进行反序列化操作,并记录每种库所花费的时间。测试方法可能包括以下步骤: 1. **数据准备**:创建一个包含大量键值...
- 解析JSON:使用Android的`org.json`库或第三方库如Gson、Jackson来解析这两个JSON文件。例如,用`org.json`解析: ```java JSONObject provincesObject = new JSONObject(jsonString); JSONArray ...
在Android应用开发中,与服务器进行数据交互是常见的需求,其中JSON作为一种轻量级的数据交换格式,被广泛用于客户端和服务器之间的通信。本教程将详细讲解如何在Android中获取通过HTTP协议传输的JSON数据,以及如何...
在Android开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也方便机器解析和生成。当应用需要与服务器进行数据交互时,JSON是常见的数据传输格式。Android...
Android开发者资料大全 非常有用的资料,开发者朋友们可以学习下
在Android SDK中,包含了处理JSON的类库,如`org.json`包,使得开发者能够方便地解析和生成JSON数据。 JSON支持的数据类型包括: 1. 字符串(String):使用双引号包围,如`"abc"`。特殊字符需要转义,例如`\`、`"`、...