1. 程式人生 > >FlatBuffers與protobuf效能比較

FlatBuffers與protobuf效能比較

  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. inlineconstchar **EnumNamesGENDER_TYPE()  
  18. {  
  19.  staticconstchar *names[] = { "MALE""FEMALE""OTHER"};  
  20.  return names;  
  21. }  
  22. inlineconstchar *EnumNameGENDER_TYPE(int e)  
  23. {  
  24.  return EnumNamesGENDER_TYPE()[e];  
  25. }  
  26. typedefstruct personal_info_tag  
  27. {  
  28.  unsigned           id;  
  29.  unsigned char      age;  
  30.  char               gender;  
  31.  unsigned longlong phone_num;  
  32.  char               name[32];  
  33. } personal_info;  
  34. typedefstruct 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. 相關推薦

    FlatBuffersprotobuf效能比較

      FlatBuffers釋出時,順便也公佈了它的效能資料,具體資料請見Benchmark。     它的測試用例由以下資料構成"a set of about 10 objects containing an array, 4 strings, and a la

    UITableView——reloadDatareloadSection效能比較

    週五上午,測試,有bug:每次reset模擬器後,第一次進入介面,閃退,第二次進入介面,結果正常。 以下是這個bug的錯誤日誌:  *** Terminating app due to uncaught exception 'NSInternalInconsistencyE

    JNIJNA效能比較

    在介紹JNA時,提到了JNA是基於JNI的,是在JNI上封裝了一層,JNI效能不如JNA。最近在網上看到篇簡單的比較這兩者效能的文件,感覺不錯,現轉載一下: 分別用JNI和JNA的方式建立dll,dll中包含一個get方法和一個set方法,在java端進行迴圈呼叫1000*

    linux下mutexatomic效能比較

    一種是用boost::atomic;一種直接加鎖;程式碼很簡單: #include <boost/atomic/atomic.hpp> #include <iostream> #include <stdlib.h> #include &l

    GsonFastjson效能比較

    /** * 測試比較Gson與Fastjson效能,發現數據量少的情況下fastjson比Gson稍慢, * 資料量大的情況下fastjson比Gson稍快,可以修改2個迴圈的引數進行測試。: * * */ public class TestJson {

    setTimeoutsetInterval效能比較

    談到動畫,就避不開setTimeout與setInterval,都能實現動畫效果,但對我來說,只有需要手動控制幀的速率、頻率時,我才會優先選擇setTimeout,因為我知道,論效能,setTimeout略遜於setInterval。 造成效能差異的原因,主要

    array_push $arr[]=$value 效能比較分析

    本文簡要分析一下php中array_push與$arr[] = $value兩種將元素加入陣列末尾的方法的效能 1. array_push方法 array_push 方法,將一個或多個元素壓入陣列的末尾。array_push() 將array當成一個棧,並將傳入的變數壓入array的末尾。a

    TVS管壓敏電阻的效能比較

        為滿足消費者日益增強的功能需求,如今市場中的電子產品也好,各類電力裝置也罷,其功能性也是日益增強,造福於消費者的同時,其自身面臨的威脅也在放大。一般功能性越強大的產品,其內部的晶片整合度也就越高,一旦晶片受損所造成的損失也是極大的。因此,如今市場中的各類產品的防護等級都是偏高的,而這類防護方案都不可

    String.split(),StringTokenizer,StringUtils.split()的原始碼分析效能比較

    他們都是用來對字串進行切割 String.split(): 從jdk1.4開始,通過正則表示式進行字串的匹配切割,有可能會丟擲 PatternSyntaxException異常,返回的是切割之後的字串陣列。 String 的split 有兩個過載的方法分別是

    CPUGPU效能比較報告

    執行時間分析 不同的模型在cpu和gpu下的時間差異較大,一般來說gpu會比cpu快5-20倍。我們選用了最常用的inception v3的分類模型,輸入圖片尺寸為:3x299x299。 GPU 在一塊P100GPU(視訊記憶體16276MiB),效能如下: 由上圖可見,隨著程序數目的增大耗時會線性增加。

    xml方式excel、以及jxl方式匯出效能比較

    通過xml方式匯出excel沒有65536資料條數限制,於是嘗試了一下,具體程式碼如下: private static int maxRow = 1000000; /** * 通過xml方式寫入文件匯出excel檔案 * @param shee

    JavaScript——for和for in 的效能比較for迴圈的優化方案

    在JavaScript中,我們遍歷陣列的時候經常需要用到for和for in。今天來比較一下這兩個遍歷方法的效能,並提供優化方案。 1.for 和for in的效能比較 我們都知道,for 和for in的時間複雜度一樣,但是其效能有些許差距。具體有多大差距呢,下面我們來

    開發日常小結(31):陣列array列表ArrayList的遍歷效能比較分析

    2018年10月03日 目錄 測試結論 測試例子 效能分析 測試結論 Java兩個常用的資料結構進行效能的比較,發現ArrayList和array還是相差較大的,陣列的遍歷時間遠遠小於ArrayList。 測試例子 impo

    DeepLearning4j實戰(7):手寫體數字識別GPU實現效能比較

    在之前的部落格中已經用單機、Spark分散式兩種訓練的方式對深度神經網路進行訓練,但其實DeepLearning4j也是支援多GPU訓練的。這篇文章我就總結下用GPU來對DNN/CNN進行訓練和評估過程。並且我會給出CPU、GPU和多卡GPU之前的效能比較圖表。不過,由於重點在於說明Mnist資料集

    【R語言】data.framedata.table的效能比較

    測試案例說明 總資料量為6000條。平均的分佈在20個data.frame/data.table變數中。 這20個變數儲存在list中,以1:20表示。 將20個變數合併成一個。 資料格式一致。 用d

    利用Keras開發用於分類問題的雙向LSTM及LSTM效能比較

    雙向LSTM是傳統LSTM的擴充套件,可以提高序列分類問題的模型效能。在輸入序列為時間問題的分類資料上,雙向LSTM在輸入序列上訓練的模型是兩個而不是一個LSTM。輸入序列中的第一個是原始樣本,第二個是輸入序列的反向樣本。這可以為網路提供額外的上下文,並且可以更快,更全面地學

    gmap,以及sync.Map的效能比較

    gf框架提供了幾個非常實用的併發安全容器,其中gmap就是專案開發中最常用的一個。 從執行效率上考慮,基於不同的需求場景,選擇合適的型別結構體,其執行效率是不一樣的,以下使用基準測試來對比各個型別的寫入效能(測試程式碼): john@johnstation:~/Wor

    【R語言】合併行操作中data.framedata.table的效能比較

    測試案例說明 總資料量為M*N條。平均的分佈在N個data.frame/data.table變數中,每個變數為M行。 這N個變數儲存在list中,以1:N表示。list(data.frame)與list(data.table)。 將N個變數合併成一個。 N個

    【Java Native】【JNIJNA效能比較

       分別用JNI和JNA的方式建立dll,dll中包含一個get方法和一個set方法,在java端進行迴圈呼叫1000*1000次,比較所耗費的時間。   JNI和JNA呼叫的不是同一個dll,但是功能和程式碼基本相同。本測試從一定角度反映他們的效能。 1.  JN

    SpringMVC 檔案下載之 --- IONIO實現及其效能比較

    我的Controller類:FileController.javapackage aboo.controller; import aboo.bean.FileInfo; import aboo.service.FileService; import io.swagger.annotations.Api; i