FlatBuffers vs Protocol Buffers

FlatBuffers去年发布,最近看了一下,与同是出自Google之手的Protocol Buffers非常类似。在官网上介绍,FlatBuffers(简称FB)主要针对game development和对性能有要求的应用。相对于Protocol Buffers(简称PB),FB不需要解析,只通过序列化后的二进制buffer即可完成数据访问。

FB的主要特点有:

1)数据访问不需要解析

将数据序列化成二进制buffer,之后的数据访问直接读取这个buffer,所以读取的效率很高。

2)内存高效、速度快

- 数据访问只在序列化后的二进制buffer,不需额外的内存分配。

- 数据访问速度接近原生的struct,只多了一次解引用(根据起始地址和偏移量,然后取值)

3)弹性

都是可选字段,支持向前、向后兼容

4)生成的代码量小

只需依赖一个头文件

5)强类型

编译时检测错误

6)易于使用

可以解析schema和json文本

7)跨平台

C++/Java/Go不需额外依赖

FB的实现原理:

通过FB序列化后的数据就是一个二进制buffer,内部包含各种objects(structs,tables,vectors),通过offset组织。所以数据可以in-place访问(起始地址+偏移量),就像数组或者struct访问。

FB中table代表一个数据结构,这个table会对应一个vtable,用于指示各个字段在buffer中的偏移量。接下来,在访问某个字段时,直接根据偏移量就可以找到该字段。 由于FB直接访问raw buffer,所以在数据破坏时,会得到脏数据。FB通过Verifier确保不可信buffer数据是正确的。

下面测试了PB和FB,做性能对比,测试场景很简单,构造N个对象,序列化,写入文件,然后再反序列化。测试的对象结构如下:

message Sample {
    required int32 id = 1;
    required string name = 2;
    required int32 ip = 3;
    repeated int32 addr_list = 4;
}

测试结果如下:


记录个数

FlatBuffers

Protocol Buffers

10000

0.197  /  4.4M  /  0.02

0.166  / 3.0M  /  0.08

20000

0.383  /  8.8M  /  0.03

0.248  / 6.4M  /  0.168

30000

0.534  / 13M   /  0.05

0.378  / 10M  / 0.26

100000

1.937  /  44M  /  0.144

1.314  /  38M  /  0.8

200000

3.9  /  88M  /  0.276

2.66  /  67M  /  1.542

1000000

17.59  /  439M  /  1.396

13.355  /  397M  /  8.012

X  /  Y  /  Z三个数据,分别对应,序列化总时间  /  文件大小  /  反序列时间,其中包括读写文件的时间。可以看到,PB在序列化的时间和大小都要优于FB,序列化要快30%左右,序列化数据大小要小20%左右。而FB由于不需要解析,反序列化异常快。

虽然FB的反序列化超级快,但是数据大小还是蛮大的(可能的原因是不需要解析,直接访问binary buffer,所以不能对数据进行压缩),带来的传输或存储开销,可能会抵过一部分反序列化的时间。感觉上,FB的使用场景上还是很受限,在移动端可能是一个应用场景。

具体测试代码见github

时间: 2024-12-12 16:49:33

FlatBuffers vs Protocol Buffers的相关文章

Protocol Buffers(Protobuf)开发者指南---概览

Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关.可扩展的结构化数据序列化/反序列化工具,适用于通讯协议,数据存储等场合. ps:为了方便拼写,下文的protobuf就是指protocol buffers. 本文档的面向读者是:希望使用protobuf的 Java.C++.Python的开发者.此概览将向您介绍如何开始使用protobuf,然后您

Java使用Protocol Buffers入门四步骤

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化.反序列化,经常用于网络传输. 这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差.类似的还有json.Java的Serializable等. protobuf支持各种语言.本文以Java为例,简单介绍protobuf如何使用.其他语言使用方法类似. 首先需要下载: http://download.csdn.net/downlo

如何在 PHP 中处理 Protocol Buffers 数据

Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高.感兴趣的可以访问这里.Protocol Buffers官方只支持C++, Java, Python, C#, Go,如果想在PHP中使用Protocol Buffers,需要借助于第三方的扩展,使用方法如下. 安装protoc编译器 第一步,安装Google的protoc编译器,这个工具可以把pr

Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南

Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用protobuf定义i结构化Protobuf数据,包括.proto文件语法和如何使用.proto文件生成数据存取类. 作为一个参考指南,本文档将以示例的形式一步步向您介绍Protobuf的特点.您可以参考您所选择的语言的示例.tutorial ----------------------------

Protocol Buffers(protobuf)java初体验

由于项目需要所以简单的研究了下protobuf.我也是参照网上的博客,所以大部分内容我也就不重复造轮子了.首先protobuf介绍点击这里,使用介绍点击这里,使用demo看这里.我个人的第一个例子也是参照这个demo来的,不过其中我有遇到一些问题,所以揪出来说说,也就给自己做个笔记,方便查阅. 基本的东西相信大家也了解了,直接步入主题了: 1.限定修饰符介绍 required\optional\repeated,之前给定的博客已经有这个介绍了我也不多说,这里把一些小玩儿拿出来讲讲 ①.requi

使用 Protocol Buffers 代替 JSON 的五个原因

在Ruby和Rails开发者中,面向服务(Service-Oriented)架构有一个当之无愧的名声,它是一个缓解程序规模恶性增长的一个强有力的途径,可在大量应用程序中提取关注点.这些新生小巧的服务通常继续使用Rails或Sinatra,并使用JSON在HTTP上通信.尽管JSON作为一个数据相互交换格式,有很多优点:人类可读.可理解,并通常表现出色. 浏览器和JS并不直接处理数据--尤其是遇到内部服务时.我的观点是,结构化格式,例如谷歌的Protocol Buffers,是一个比JSON在编码

理解netty对protocol buffers的编码解码

一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展:4)性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优:5)成熟.稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼:6)社区活跃,版本迭代周期短,发现的BUG可以

(转)Protocol Buffers for C

我一直不太满意 google protocol buffers 的默认设计.为每个 message type 生成一大坨 C++ 代码让我很难受.而且官方没有提供 C 版本,第三方的 C 版本 也不让我满意. 这种设计很难让人做动态语言的 binding ,而大多数动态语言往往又没有强类型检查,采用生成代码的方式并没有特别的好处,反而有很大的性能损失(和通常做一个 bingding 库的方式比较).比如官方的 Python 库,完全可以在运行时,根据协议,把那些函数生成出来,而不必用离线的工具生

Google Protocol Buffers 概述 转

Google Protocol Buffers 概述 个人小站,正在持续整理中,欢迎访问:http://shitouer.cn 小站博文地址:Google Protocol Buffers 概述 推荐阅读顺序,希望给你带来收获~ <Google Protocol Buffers 概述> <Google Protocol Buffers 入门> <Protocol Buffers 语法指南> <Google Protocol Buffers 编码(Encoding)