原帖地址:http://blog.csdn.net/menggucaoyuan/article/details/34409433

原作者:企鹅  menggucaoyuan

未经原作者同意不允许转载

  • 感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力以及转载收藏动力。欢迎转载!
  • 版权声明:本文原创发表于 【请点击连接前往】 ,未经作者同意必须保留此段声明!如有问题请联系我,侵立删,谢谢!
  • 我的博客:http://www.cnblogs.com/GJM6/  -  传送门:【点击前往
 

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文件如下:

  1. //////////////////////////////////////////////////////
  2. //// FILE     : tellist.fbs
  3. //// DESC     : basic message for msg-center
  4. //// AUTHOR   : v 0.1 written by Alex Stocks on June 22, 2014
  5. //// LICENCE  :
  6. //// MOD      :
  7. ////////////////////////////////////////////////////////
  8. namespace as.tellist;
  9. enum GENDER_TYPE : byte
  10. {
  11. MALE    = 0,
  12. FEMALE  = 1,
  13. OTHER   = 2
  14. }
  15. table personal_info
  16. {
  17. id : uint;
  18. name : string;
  19. age : byte;
  20. gender : GENDER_TYPE;
  21. phone_num : ulong;
  22. }
  23. table personal_info_list
  24. {
  25. info : [personal_info];
  26. }
  27. root_type personal_info_list;

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

  1. //////////////////////////////////////////////////////
  2. //// FILE     : tellist.proto
  3. //// DESC     : basic message for msg-center
  4. //// AUTHOR   : v 0.1 written by Alex Stocks on June 22, 2014
  5. //// LICENCE  :
  6. //// MOD      :
  7. ////////////////////////////////////////////////////////
  8. package as.tellist;
  9. enum gender_type
  10. {
  11. MALE    = 0;
  12. FEMALE  = 1;
  13. OTHER   = 2;
  14. }
  15. message personal_info
  16. {
  17. optional uint32         id = 1;
  18. optional string         name = 2;
  19. optional uint32         age = 3;
  20. optional gender_type    gender = 4;
  21. optional uint64         phone_num = 5;
  22. }
  23. message personal_info_list
  24. {
  25. repeated personal_info  info = 1;
  26. }

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

  1. /**
  2. * FILE        : tellist.h
  3. * DESC        : to test tellist
  4. * AUTHOR  : v1.0 written by Alex Stocks
  5. * DATE        : on June 28, 2014
  6. * LICENCE : GPL 2.0
  7. * MOD     :
  8. **/
  9. #ifndef __TELLIST_H__
  10. #define __TELLIST_H__
  11. enum
  12. {
  13. GENDER_TYPE_MALE = 0,
  14. GENDER_TYPE_FEMALE = 1,
  15. GENDER_TYPE_OTHER = 2,
  16. };
  17. inline const char **EnumNamesGENDER_TYPE()
  18. {
  19. static const char *names[] = { "MALE", "FEMALE", "OTHER"};
  20. return names;
  21. }
  22. inline const char *EnumNameGENDER_TYPE(int e)
  23. {
  24. return EnumNamesGENDER_TYPE()[e];
  25. }
  26. typedef struct personal_info_tag
  27. {
  28. unsigned           id;
  29. unsigned char      age;
  30. char               gender;
  31. unsigned long long phone_num;
  32. char               name[32];
  33. } personal_info;
  34. typedef struct personal_info_list_tag
  35. {
  36. int                size;
  37. personal_info  info[0];
  38. } personal_info_list;
  39. #endif
  40. // the end of the header file tellist.h

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

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

  1. 测试环境:12Core Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
  2. free
  3. total       used       free     shared    buffers     cached
  4. Mem:      66081944   62222028    3859916          0     196448   43690828
  5. -/+ buffers/cache:   18334752   47747192
  6. Swap:       975864     855380     120484
  7. protobuf三次测试结果:
  8. bin/tellist_pb
  9. encode: loop = 1000000, time diff = 14210ms
  10. decode: loop = 1000000, time diff = 11185ms
  11. buf size:841
  12. bin/tellist_pb
  13. encode: loop = 1000000, time diff = 14100ms
  14. decode: loop = 1000000, time diff = 11234ms
  15. buf size:841
  16. bin/tellist_pb
  17. encode: loop = 1000000, time diff = 14145ms
  18. decode: loop = 1000000, time diff = 11237ms
  19. buf size:841
  20. 序列化后占用内存空间841Byte,encode平均运算时间42455ms / 3 = 14151.7ms,decode平均计算时间33656ms / 3 = 11218.7ms
  21. flatbuffers三次测试结果:
  22. bin/tellist_fb
  23. encode: loop = 1000000, time diff = 11666ms
  24. decode: loop = 1000000, time diff = 1141ms
  25. buf size:1712
  26. bin/tellist_fb
  27. encode: loop = 1000000, time diff = 11539ms
  28. decode: loop = 1000000, time diff = 1200ms
  29. buf size:1712
  30. bin/tellist_fb
  31. encode: loop = 1000000, time diff = 11737ms
  32. decode: loop = 1000000, time diff = 1141ms
  33. buf size:1712
  34. 序列化后占用内存空间1712Byte,encode平均运算时间34942ms / 3 = 11647.3ms,decode平均计算时间3482ms / 3 = 1160.7ms
  35. 二进制三次测试结果:
  36. bin/tellist
  37. encode: loop = 1000000, time diff = 4967ms
  38. decode: loop = 1000000, time diff = 688ms
  39. buf size:304
  40. bin/tellist
  41. encode: loop = 1000000, time diff = 4971ms
  42. decode: loop = 1000000, time diff = 687ms
  43. buf size:304
  44. bin/tellist
  45. encode: loop = 1000000, time diff = 4966ms
  46. decode: loop = 1000000, time diff = 686ms
  47. buf size:304
  48. 序列化后占用内存空间304Byte,encode平均运算时间14904ms / 3 = 4968ms,decode平均计算时间2061ms / 3 = 687ms
  49. 测试环境:1 Core Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
  50. free
  51. total       used       free     shared    buffers     cached
  52. Mem:        753932     356036     397896          0      50484     224848
  53. -/+ buffers/cache:      80704     673228
  54. Swap:      1324028        344    1323684
  55. protobuf三次测试结果:
  56. ./bin/tellist_pb
  57. encode: loop = 1000000, time diff = 12451ms
  58. decode: loop = 1000000, time diff = 9662ms
  59. buf size:841
  60. ./bin/tellist_pb
  61. encode: loop = 1000000, time diff = 12545ms
  62. decode: loop = 1000000, time diff = 9840ms
  63. buf size:841
  64. ./bin/tellist_pb
  65. encode: loop = 1000000, time diff = 12554ms
  66. decode: loop = 1000000, time diff = 10460ms
  67. buf size:841
  68. 序列化后占用内存空间841Byte,encode平均运算时间37550ms / 3 = 12516.7ms,decode平均计算时间29962ms / 3 = 9987.3ms
  69. flatbuffers三次测试结果:
  70. bin/tellist_fb
  71. encode: loop = 1000000, time diff = 9640ms
  72. decode: loop = 1000000, time diff = 1164ms
  73. buf size:1712
  74. bin/tellist_fb
  75. encode: loop = 1000000, time diff = 9595ms
  76. decode: loop = 1000000, time diff = 1170ms
  77. buf size:1712
  78. bin/tellist_fb
  79. encode: loop = 1000000, time diff = 9570ms
  80. decode: loop = 1000000, time diff = 1172ms
  81. buf size:1712
  82. 序列化后占用内存空间1712Byte,encode平均运算时间28805ms / 3 = 9345ms,decode平均计算时间3506ms / 3 = 1168.7ms
  83. 二进制三次测试结果:
  84. bin/tellist
  85. encode: loop = 1000000, time diff = 4194ms
  86. decode: loop = 1000000, time diff = 538ms
  87. buf size:304
  88. bin/tellist
  89. encode: loop = 1000000, time diff = 4387ms
  90. decode: loop = 1000000, time diff = 544ms
  91. buf size:304
  92. bin/tellist
  93. encode: loop = 1000000, time diff = 4181ms
  94. decode: loop = 1000000, time diff = 533ms
  95. buf size:304
  96. 序列化后占用内存空间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 性能比较 [转载 ]的更多相关文章

  1. FlatBuffers与protobuf性能比较

    FlatBuffers发布时,顺便也公布了它的性能数据,具体数据请见Benchmark. 它的测试用例由以下数据构成"a set of about 10 objects containing ...

  2. FlatBuffers与protobuf性能比較

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

  3. Graphic32中TBitmap32.TextOut性能分析[转载]

    转载:http://blog.csdn.net/avan_lau/article/details/6958497 最近在分析软件中画线效率问题,发现在画一些标志性符号的方法,存在瓶颈,占用较大的时间. ...

  4. Ehcache/Redis/Tair缓存性能对比[转载]

    FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...

  5. 深入浅出-iOS程序性能优化 (转载)

    iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象. iOS应用是非常注重用户体验的,不光是要求 ...

  6. 借助 MySQLTuner 优化 MySQL 性能(转载的一篇文章)

    MySQLTuner 是一个 Perl 脚本,可以用来分析您的 MySQL 性能,并且基于收集到的信息给出相应的优化建议.这样子,您就可以调整 my.cnf 从而优化您的 MySQL 设置. 这边只是 ...

  7. Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较(转载)

    Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...

  8. Tomcat性能优化(转载)

    出处:微信订阅号GitChat精品课程 — Tomcat性能优化 Tomcat 简单介绍 Sun 公司创建了第一个 Servlet 容器,即 Java Web Server,但 JWS 只是为了演示 ...

  9. Android_性能优化转载

    胡凯 RSS Blog Archives Android Training in Chinese About Android性能优化典范 JAN 17TH, 2015 | COMMENTS 2015年 ...

随机推荐

  1. Android 常见Crash Log汇总

    一.BinderProxy@4479b390 is not valid; is your activity running? 原因分析: 因为使用了AsyncTask 异步线程在线程完成以后的onPo ...

  2. jeasyUI的treegrid批量删除多行(转载)

    看上去,JavaScript的变量类型,也可以分为值类型和引用类型.赋值操作中,值类型,各自独立,互不干涉:引用类型,指针而已,大家指向同一个对象. 为什么这样说呢? 我是从jeasyUI的treeg ...

  3. Android引导页设计

    大家在安装好一个应用后,第一次打开时往往会出现一个使用引导页,形式一般为三.四张图片,随着我们的滑动进行切换,在最后一页会有一个进入应用的按钮,我们通过点击这个按钮可以进入应用,其实这其中没有太多的复 ...

  4. MongoDB的学习--索引

    索引可以用来优化查询,而且在某些特定类型的查询中,索引是必不可少的.为集合选择合适的索引是提高性能的关键. 先来mock数据 for (i = 0; i < 1000000; i++) { db ...

  5. 学习制作精美 CSS3 按钮效果的10个优秀教程

    由于互联网世界正在发生变化,人们往往喜欢那些有更多互动元素的网站,因此现在很多 Web 开发人员也在专注于提高他们的 CSS3 技能,因为 CSS3 技能可以帮助他们在很大的程度上实现所需的吸引力.这 ...

  6. 【转】图文详解YUV420数据格式

    YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y, ...

  7. bootbox上的浮层弹出如何加上datepicker

    bootbox和datepicker都是插件,我想要做的需求大致长这样: 我希望使用bootbox弹出的对话框中能弹出一个截止时间的选择框,这个选择框使用datepicker来做. 看了下这个帖子: ...

  8. qml基础学习 模型视图(一)

    一.理解qml模型和视图 qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好.qml部分是qt4 ...

  9. 【原创】Kakfa metrics包源代码分析

    这个包主要是与Kafka度量相关的. 一.KafkaTimer.scala 对代码块的运行进行计时.仅提供一个方法: timer——在运行传入函数f的同时为期计时 二.KafkaMetricsConf ...

  10. Web API应用架构在Winform混合框架中的应用(1)

    在<Web API应用架构设计分析(1)>和<Web API应用架构设计分析(2)>中对WebAPI的架构进行了一定的剖析,在当今移动优先的口号下,传统平台都纷纷开发了属于自己 ...