FlatBuffers发布时,顺便也公布了它的性能数据,具体数据请见Benchmark

它的测试用例由以下数据构成"a set of about 10 objects containing an array, 4 strings, and a large variety of int/float scalar values of all sizes, meant to be representative of game data, e.g. a scene format."

我感觉这样测试如同儿戏,便自己设计了一个测试用例,主要关注CPU计算时间和内存空间占用两个指标,参考对象是protobuf。

测试用例为:序列化一个通讯录personal_info_list(table),通讯录可以认为是有每个人的信息(personal_info)的集合。每个人信息personal_info(table)有:个人id(uint)、名字(string)、年龄(byte)、性别(enum, byte)和电话号码(ulong)。本来我想用struct表示personal_info(table),但是struct不允许有数组或string成员,无奈我用table描述它了。相应的idl文件如下:

//////////////////////////////////////////////////////
//// FILE : tellist.fbs
//// DESC : basic message for msg-center
//// AUTHOR : v 0.1 written by Alex Stocks on June 22, 2014
//// LICENCE :
//// MOD :
//////////////////////////////////////////////////////// namespace as.tellist; enum GENDER_TYPE : byte
{
MALE = 0,
FEMALE = 1,
OTHER = 2
} table personal_info
{
id : uint;
name : string;
age : byte;
gender : GENDER_TYPE;
phone_num : ulong;
} table personal_info_list
{
info : [personal_info];
} root_type personal_info_list;

因为要以protobuf做性能参考,列出protobuf的idl文件如下:

//////////////////////////////////////////////////////
//// FILE : tellist.proto
//// DESC : basic message for msg-center
//// AUTHOR : v 0.1 written by Alex Stocks on June 22, 2014
//// LICENCE :
//// MOD :
//////////////////////////////////////////////////////// package as.tellist; enum gender_type
{
MALE = 0;
FEMALE = 1;
OTHER = 2;
} message personal_info
{
optional uint32 id = 1;
optional string name = 2;
optional uint32 age = 3;
optional gender_type gender = 4;
optional uint64 phone_num = 5;
} message personal_info_list
{
repeated personal_info info = 1;
}

若用C的struct描述对应的头文件(其对应的程序称之为“二进制”),如下:

/**
 * FILE : tellist.h
 * DESC : to test tellist
 * AUTHOR : v1.0 written by Alex Stocks
 * DATE : on June 28, 2014
 * LICENCE : GPL 2.0
 * MOD :
 **/ #ifndef __TELLIST_H__
#define __TELLIST_H__ enum
{
GENDER_TYPE_MALE = 0,
GENDER_TYPE_FEMALE = 1,
GENDER_TYPE_OTHER = 2,
}; inline const char **EnumNamesGENDER_TYPE()
{
static const char *names[] = { "MALE", "FEMALE", "OTHER"};
return names;
} inline const char *EnumNameGENDER_TYPE(int e)
{
return EnumNamesGENDER_TYPE()[e];
} typedef struct personal_info_tag
{
unsigned id;
unsigned char age;
char gender;
unsigned long long phone_num;
char name[32];
} personal_info; typedef struct personal_info_list_tag
{
int size;
personal_info info[0];
} personal_info_list; #endif // the end of the header file tellist.h

测试时,在内存中构造37个personal_info对象,并序列化之,重复这个过程100万次,然后再进行反序列化,再重复100万次。

测试结果如下(补充:tellist_pb是protobuf测试程序,tellist_fb是FlatBuffers测试程序,tellist_fb是二进制测试程序,):

测试环境:12Core Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
free
             total       used       free     shared    buffers     cached
Mem:      66081944   62222028    3859916          0     196448   43690828
-/+ buffers/cache:   18334752   47747192
Swap:       975864     855380     120484 protobuf三次测试结果:
bin/tellist_pb 
encode: loop = 1000000, time diff = 14210ms
decode: loop = 1000000, time diff = 11185ms
buf size:841 bin/tellist_pb 
encode: loop = 1000000, time diff = 14100ms
decode: loop = 1000000, time diff = 11234ms
buf size:841 bin/tellist_pb 
encode: loop = 1000000, time diff = 14145ms
decode: loop = 1000000, time diff = 11237ms
buf size:841
序列化后占用内存空间841Byte,encode平均运算时间42455ms / 3 = 14151.7ms,decode平均计算时间33656ms / 3 = 11218.7ms flatbuffers三次测试结果:
 bin/tellist_fb 
encode: loop = 1000000, time diff = 11666ms
decode: loop = 1000000, time diff = 1141ms
buf size:1712 bin/tellist_fb 
encode: loop = 1000000, time diff = 11539ms
decode: loop = 1000000, time diff = 1200ms
buf size:1712 bin/tellist_fb 
encode: loop = 1000000, time diff = 11737ms
decode: loop = 1000000, time diff = 1141ms
buf size:1712
序列化后占用内存空间1712Byte,encode平均运算时间34942ms / 3 = 11647.3ms,decode平均计算时间3482ms / 3 = 1160.7ms 二进制三次测试结果:
bin/tellist 
encode: loop = 1000000, time diff = 4967ms
decode: loop = 1000000, time diff = 688ms
buf size:304  bin/tellist 
encode: loop = 1000000, time diff = 4971ms
decode: loop = 1000000, time diff = 687ms
buf size:304 bin/tellist 
encode: loop = 1000000, time diff = 4966ms
decode: loop = 1000000, time diff = 686ms
buf size:304
序列化后占用内存空间304Byte,encode平均运算时间14904ms / 3 = 4968ms,decode平均计算时间2061ms / 3 = 687ms 测试环境:1 Core Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
free
             total       used       free     shared    buffers     cached
Mem:        753932     356036     397896          0      50484     224848
-/+ buffers/cache:      80704     673228
Swap:      1324028        344    1323684
protobuf三次测试结果:
./bin/tellist_pb 
encode: loop = 1000000, time diff = 12451ms
decode: loop = 1000000, time diff = 9662ms
buf size:841 ./bin/tellist_pb 
encode: loop = 1000000, time diff = 12545ms
decode: loop = 1000000, time diff = 9840ms
buf size:841 ./bin/tellist_pb 
encode: loop = 1000000, time diff = 12554ms
decode: loop = 1000000, time diff = 10460ms
buf size:841
序列化后占用内存空间841Byte,encode平均运算时间37550ms / 3 = 12516.7ms,decode平均计算时间29962ms / 3 = 9987.3ms flatbuffers三次测试结果:
bin/tellist_fb 
encode: loop = 1000000, time diff = 9640ms
decode: loop = 1000000, time diff = 1164ms
buf size:1712 bin/tellist_fb 
encode: loop = 1000000, time diff = 9595ms
decode: loop = 1000000, time diff = 1170ms
buf size:1712 bin/tellist_fb 
encode: loop = 1000000, time diff = 9570ms
decode: loop = 1000000, time diff = 1172ms
buf size:1712
序列化后占用内存空间1712Byte,encode平均运算时间28805ms / 3 = 9345ms,decode平均计算时间3506ms / 3 = 1168.7ms 二进制三次测试结果:
bin/tellist 
encode: loop = 1000000, time diff = 4194ms
decode: loop = 1000000, time diff = 538ms
buf size:304 bin/tellist 
encode: loop = 1000000, time diff = 4387ms
decode: loop = 1000000, time diff = 544ms
buf size:304 bin/tellist 
encode: loop = 1000000, time diff = 4181ms
decode: loop = 1000000, time diff = 533ms
buf size:304
序列化后占用内存空间304Byte,encode平均运算时间12762ms / 3 = 4254ms,decode平均计算时间1615ms / 3 = 538.3ms

上面的二进制程序的结果无论在内存空间占用还是cpu计算时间这两个指标上都是最快的。但本文只讨论FlatBuffers和protobuf,所以不让它的结果参与比较。

从以上数据看出,在内存空间占用这个指标上,FlatBuffers占用的内存空间比protobuf多了两倍。序列化时二者的cpu计算时间FB比PB快了3000ms左右,反序列化时二者的cpu计算时间FB比PB快了9000ms左右。FB在计算时间上占优势,而PB则在内存空间上占优(相比FB,这也正是它计算时间比较慢的原因)。

上面的测试环境是在公司的linux server端和我自己的mac pro分别进行的。请手机端开发者自己也在手机端进行下测试, 应该能得到类似的结果。Google宣称FB适合游戏开发是有道理的,如果在乎计算时间我想它也适用于后台开发。

另外,FB大量使用了C++11的语法,其从idl生成的代码接口不如protubuf友好。不过相比使用protobuf时的一堆头文件和占18M之多的lib库,FlatBuffers仅仅一个"flatbuffers/flatbuffers.h"就足够了。

测试程序已经上传到百度网盘,点击这个链接即可下载。欢迎各位的批评意见。

FlatBuffers与protobuf性能比较的更多相关文章

  1. GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]

    原帖地址:http://blog.csdn.net/menggucaoyuan/article/details/34409433 原作者:企鹅  menggucaoyuan 未经原作者同意不允许转载 ...

  2. FlatBuffers与protobuf性能比較

    FlatBuffers发布时.顺便也发布了它的性能数据,详细数据请见Benchmark. 它的測试用例由下面数据构成"a set of about 10 objects containing ...

  3. Google序列化库FlatBuffers 1.1发布,及与protobuf的比较

    个人总结: FlatBuffer相对于Protobuffer来讲,优势如下: 1. 由于省去了编解码的过程,所以从速度上快于Protobuffer,个人测试结果100w次编解码,编码上FlatBuff ...

  4. FlatBuffers使用简介

    @[tools|flatbuffers|opensource] 概述### Google在今年6月份发布了跨平台序列化工具FlatBuffers,提供了C++/Java/Go/C#接口支持,这是一个注 ...

  5. 从微信SDK看ProtoBuffer文件的生成

    前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无 ...

  6. 在Android中使用FlatBuffers(中篇)

    本文来自网易云社区. FlatBuffers.Protobuf及JSON对比测试 FlatBuffers相对于Protobuf的表现又如何呢?这里我们用数据说话,对比一下FlatBuffers格式.J ...

  7. 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)

    本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...

  8. (62)通信协议之一protobuf

     Protobuf协议特点分析 KingKa.吴永聪 1.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供的一个具有高效的协议数据交换格式 ...

  9. C++序列化、反序列化

    几个常见的库 http://stackoverflow.com/questions/3637581/fastest-c-serialization Boost: Fast, assorted C++ ...

随机推荐

  1. poj -2229 Sumsets (dp)

    http://poj.org/problem?id=2229 题意很简单就是给你一个数n,然后选2的整数幂之和去组成这个数.问你不同方案数之和是多少? n很大,所以输出后9位即可. dp[i] 表示组 ...

  2. BZOJ 1507 Editor(块状链表)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1507 题意:一个文本编辑器,模拟以下操作: 思路:块状链表的主要操作: (1)find( ...

  3. MDM平台学习笔记

    最近和将来一段时间都会花很多时间在主数据管理平台的学习和开发上,从现在开始打算记录此过程中的知识点和学习心得,加油! 1.IBM全新的产品文档网站IBM Knowledge Center,软件硬件产品 ...

  4. gdb mysq

    1.找到mysqld的id [root@default-tpl ~]# ps aux|grep mysqldroot 5006 0.0 0.0 103252 796 pts/6 S+ 15:15 0: ...

  5. sublime exclude folder?

    在sublime的项目中,其配置文件实际上是一个json文件,如果希望将某些文件夹或者文件排除在项目有效文件外,有以下方法: 在folder_exclude_patterns中输入对应的文件夹或者正则 ...

  6. how bootstrap fit into our website design?

    在web相关技术中,HTML代表了content,structure, CSS则负责styling,决定内容是如何展示的,javascript则主要负责interactive, behaviour. ...

  7. 【笨嘴拙舌WINDOWS】实践检验之屏幕取色

    实践是检验真理的唯一标准 要取得屏幕的颜色,首先需要创建一个屏幕DC,然后使用该DC,调用GetPixel就可以了 "Note:GetPixel传入的DC应该是屏幕的DC,而不是桌面的DC, ...

  8. HDU 3389 (Nim博弈变形) Game

    参考了众巨巨的博客,现在重新整理一下自己的思路. 首先在纸上画了一下转移图: 1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中 ...

  9. Strlen()与sizeof()

    在学习C语言时以及面试中,经常会见到strlen()与sizeof()这一对容易混淆的概念,搞清楚这两个概念,往往考察了编程人员对语言的基本掌握能力. 首先大家先明确两个概念是: 1.strlen() ...

  10. 总结swift 1.2适配swift2.0遇到的改变

    swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sor ...