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檔案如下:
- //////////////////////////////////////////////////////
- //// 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,
- };
- inlineconstchar **EnumNamesGENDER_TYPE()
- {
- staticconstchar *names[] = { "MALE", "FEMALE", "OTHER"};
- return names;
- }
- inlineconstchar *EnumNameGENDER_TYPE(int e)
- {
- return EnumNamesGENDER_TYPE()[e];
- }
- typedefstruct personal_info_tag
- {
- unsigned id;
- unsigned char age;
- char gender;
- unsigned longlong phone_num;
- char name[32];
- } personal_info;
- typedefstruct 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
-
相關推薦
FlatBuffers與protobuf效能比較
FlatBuffers釋出時,順便也公佈了它的效能資料,具體資料請見Benchmark。 它的測試用例由以下資料構成"a set of about 10 objects containing an array, 4 strings, and a la
UITableView——reloadData與reloadSection效能比較
週五上午,測試,有bug:每次reset模擬器後,第一次進入介面,閃退,第二次進入介面,結果正常。 以下是這個bug的錯誤日誌: *** Terminating app due to uncaught exception 'NSInternalInconsistencyE
JNI與JNA效能比較
在介紹JNA時,提到了JNA是基於JNI的,是在JNI上封裝了一層,JNI效能不如JNA。最近在網上看到篇簡單的比較這兩者效能的文件,感覺不錯,現轉載一下: 分別用JNI和JNA的方式建立dll,dll中包含一個get方法和一個set方法,在java端進行迴圈呼叫1000*
linux下mutex與atomic效能比較
一種是用boost::atomic;一種直接加鎖;程式碼很簡單: #include <boost/atomic/atomic.hpp> #include <iostream> #include <stdlib.h> #include &l
Gson與Fastjson效能比較
/** * 測試比較Gson與Fastjson效能,發現數據量少的情況下fastjson比Gson稍慢, * 資料量大的情況下fastjson比Gson稍快,可以修改2個迴圈的引數進行測試。: * * */ public class TestJson {
setTimeout與setInterval效能比較
談到動畫,就避不開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 有兩個過載的方法分別是
CPU與GPU效能的比較報告
執行時間分析 不同的模型在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.frame與data.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.frame與data.table的效能比較
測試案例說明 總資料量為M*N條。平均的分佈在N個data.frame/data.table變數中,每個變數為M行。 這N個變數儲存在list中,以1:N表示。list(data.frame)與list(data.table)。 將N個變數合併成一個。 N個
【Java Native】【JNI與JNA效能的比較】
分別用JNI和JNA的方式建立dll,dll中包含一個get方法和一個set方法,在java端進行迴圈呼叫1000*1000次,比較所耗費的時間。 JNI和JNA呼叫的不是同一個dll,但是功能和程式碼基本相同。本測試從一定角度反映他們的效能。 1. JN
SpringMVC 檔案下載之 --- IO與NIO實現及其效能比較
我的Controller類:FileController.javapackage aboo.controller; import aboo.bean.FileInfo; import aboo.service.FileService; import io.swagger.annotations.Api; i