GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]
原帖地址:http://blog.csdn.net/menggucaoyuan/article/details/34409433
原作者:企鹅 menggucaoyuan
未经原作者同意不允许转载
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"就足够了。
GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]的更多相关文章
- FlatBuffers与protobuf性能比较
FlatBuffers发布时,顺便也公布了它的性能数据,具体数据请见Benchmark. 它的测试用例由以下数据构成"a set of about 10 objects containing ...
- FlatBuffers与protobuf性能比較
FlatBuffers发布时.顺便也发布了它的性能数据,详细数据请见Benchmark. 它的測试用例由下面数据构成"a set of about 10 objects containing ...
- Graphic32中TBitmap32.TextOut性能分析[转载]
转载:http://blog.csdn.net/avan_lau/article/details/6958497 最近在分析软件中画线效率问题,发现在画一些标志性符号的方法,存在瓶颈,占用较大的时间. ...
- Ehcache/Redis/Tair缓存性能对比[转载]
FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...
- 深入浅出-iOS程序性能优化 (转载)
iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象. iOS应用是非常注重用户体验的,不光是要求 ...
- 借助 MySQLTuner 优化 MySQL 性能(转载的一篇文章)
MySQLTuner 是一个 Perl 脚本,可以用来分析您的 MySQL 性能,并且基于收集到的信息给出相应的优化建议.这样子,您就可以调整 my.cnf 从而优化您的 MySQL 设置. 这边只是 ...
- Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较(转载)
Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...
- Tomcat性能优化(转载)
出处:微信订阅号GitChat精品课程 — Tomcat性能优化 Tomcat 简单介绍 Sun 公司创建了第一个 Servlet 容器,即 Java Web Server,但 JWS 只是为了演示 ...
- Android_性能优化转载
胡凯 RSS Blog Archives Android Training in Chinese About Android性能优化典范 JAN 17TH, 2015 | COMMENTS 2015年 ...
随机推荐
- 手把手教你实现一个完整的 Promise
用过 Promise,但是总是有点似懂非懂的感觉,也看过很多文章,还是搞不懂 Promise的 实现原理,后面自己边看文章,边调试代码,终于慢慢的有感觉了,下面就按自己的理解来实现一个 Promise ...
- 《C与指针》第八章练习
本章问题 1.根据下面给出的声明和数据,对每个表达式进行求值并写出它的值.在对每个表达式进行求值时使用原先给出的值(也就是说,某个表达式的结果不影响后面的表达式).假定ints数组在内存中的起始位置是 ...
- wampserver中Apache启动不了的问题
今天晚上安装了wampserver,启动后,右下角的图表橙色,绿色才代表服务启动成功,到底是什么原因导致不能成功启动呢? 网上查资料,说可能是端口冲突,也可能是网络TCP/IP的设置有关系,我设置TC ...
- Ztree行政地区树状展示
Ztree行政地区树状展示(点击加载) 效果如下: 开始贴代码: 实体类 Item,用于对Ztree的节点展示 public class Item { private String id; priva ...
- JsBridge实现Javascript和Java的互相调用
前端网页Javascript和Native互相调用在手机应用中越来越常见,JsBridge是最常用的解决方案. 在Android开发中,能实现Javascript与Native代码通信的,有4种途径: ...
- 一步一步教你安装openstack
openstack,安装的门槛比较高,而且相当麻烦,很多的安装文档作者省了不少安装步骤.这对初学的人带来了很大的麻烦,也许作者轻易节省一步,就会创成后面的安装失败.而且初学者由于对openstack不 ...
- javase基础复习攻略《二》
今天就开始的真正走进JAVASE的世界,本篇介绍的是:JAVASE基础语法,大家如果有C语言的基础,对于本节内容一定感觉非常轻松,编程语言之间的都是相通的,只不过C语言属于面向过程编程,而JAVA语言 ...
- Android属性动画之ObjectAnimator控制
Android为我们提供了大量的动画效果,如何通过这些动画来达到我们需要的效果呢?今天就为大家总结一下ObjectAnimator动画控制事件. 该项目的的布局文件只有两个控件:ImageView和B ...
- Deep learning:五十(Deconvolution Network简单理解)
深度网络结构是由多个单层网络叠加而成的,而常见的单层网络按照编码解码情况可以分为下面3类: 既有encoder部分也有decoder部分:比如常见的RBM系列(由RBM可构成的DBM, DBN等),a ...
- WTF Forms – 使用 CSS 实现用户体验更好的表单
WTF forms 借助 CSS 提供友好的 HTML 表单控件,专为 IE9+ 以及最新的 Chrome.Safari 和 Firefox 浏览器.以文件输入控件的改进,使用 label 包裹在 i ...