你可能會問,既然我們已經有很標准的JSON以及轉換庫比如GSON和Jackson,為什麼還要使用新的工具呢?
不妨先試一下FlatBuffers,然後你就會發現它比JSON快得多。
FlatBuffers是什麼?
FlatBuffers是一個高效的跨平台序列化類庫,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google開發的,是為了應用在游戲開發,以及其他注重性能的應用上。
為什麼要使用FlatBuffers?
不需要解析/拆包就可以訪問序列化數據 — FlatBuffers與其他庫不同之處就在於它使用二進制緩沖文件來表示層次數據,這樣它們就可以被直接訪問而不需解析與拆包,同時還支持數據結構進化(前進、後退兼容性)。
內存高效速度快 — 訪問數據時只需要訪問內存中的緩沖區。它不需要多余的內存分配(至少在C++是這樣,其他語言中可能會有變動)。FlatBuffers還適合配合mmap或數據流使用,只需要緩沖區的一部分存儲在內存中。訪問時速度接近原結構訪問,只有一點延遲(一種虛函數表vtable),是為了允許格式升級以及可選字段。FlatBuffers適合那些花費了大量時間和空間(內存分配)來訪問和構建序列化數據的項目,比如游戲以及其他對表現敏感的應用。可以參考這裡的基准。
靈活 — 由於有可選字段,你不但有很強的升級和回退兼容性(對於歷史悠久的游戲尤其重要,不用為了每個版本升級所有數據),在選擇要存儲哪些數據以及設計數據結構時也很自由。
輕量的code footprint — FlatBuffers只需要很少量的生成代碼,以及一個表示最小依賴的很小的頭文件,很容易集成。細節上可以看上面的基准頁。
強類型 — 編譯時報錯,而不需要自己寫重復的容易出錯的運行時檢查。它可以自動生成有用的代碼。
使用方便 — 生成的C++代碼允許精簡訪問與構建代碼。還有可選的用於實現圖表解析、類似JSON的運行時字符串展示等功能的方法。(後者比JSON解析庫更快,內存效率更高)
代碼跨平台且沒有依賴 — C++代碼可以運行在任何近代的gcc/clang和VS2010上。同時還有用於測試和范例的構建文件(Android中.mk文件,其他平台是cmake文件)。
都有誰使用FlatBuffers?
BobbleApp,印度第一貼圖App。我們在BobbleApp中使用FlatBuffers後App的性能明顯增強。
Cocos2d-x,第一開源移動游戲引擎,使用FlatBuffers來序列化所有的游戲數據。
Facebook使用FlatBuffers在Android App中進行客戶端服務端的溝通。他們寫了一篇文章來描述FlatBuffers是如何加速加載內容的。
Google的Fun Propulsion Labs在他們所有的庫和游戲中大量使用FlatBuffers。
App性能有多大提高?
解析速度 解析一個20KB的JSON流(這差不多是BobbleApp的返回大小)需要35ms,超過了UI刷新間隔也就是16.6ms。如果解析JSON的話,我們就在滑動時就會因為要從磁盤加載緩存而導致掉幀(視覺上的卡頓)。
解析器初始化 一個JSON解析器需要先構建字段映射再進行解析,這會花100ms到200ms,很明顯的拖緩App啟動時間。
垃圾回收 在解析JSON時創建了很多小對象,在我們的試驗中,解析20kb的JSON流時,要分配大約100kb的瞬時存儲,對Java內存回收造成很大壓力。
FlatBuffers vs JSON
我嘗試使用FlatBuffers和JSON解析4mb的JSON文件。
FlatBuffers花了1-5ms,JSON花了大約2000ms。在使用FlatBuffers期間Android App中沒有GC,而在使用JSON時發生了很多次GC。在使用JSON時UI完全卡住,所以真實使用時只能在後台線程進行解析。
如何使用FlatBuffer呢?
我在我的GitHub中寫了一個示例,裡面手把手教你如何使用FlatBuffer。
JSON簡介以及用法匯總 http://www.linuxidc.com/Linux/2015-08/121437.htm
Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm
Linux下JSON庫的編譯及代碼測試 http://www.linuxidc.com/Linux/2013-03/81607.htm
jQuery 獲取JSON數據[$.getJSON方法] http://www.linuxidc.com/Linux/2013-03/81673.htm
用jQuery以及JSON包將表單數據轉為JSON字符串 http://www.linuxidc.com/Linux/2013-01/77560.htm
在C語言中解析JSON配置文件 http://www.linuxidc.com/Linux/2014-05/101822.htm
原文鏈接:https://medium.freecodecamp.com/why-consider-flatbuffer-over-json-2e4aa8d4ed07