你可能會問,既然咱們已經有很標準的JSON以及轉換庫好比GSON和Jackson,爲何還要使用新的工具呢?html
不妨先試一下FlatBuffers,而後你就會發現它比JSON快得多。android
FlatBuffers是什麼?git
FlatBuffers是一個高效的跨平臺序列化類庫,能夠在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google開發的,是爲了應用在遊戲開發,以及其餘注重性能的應用上。github
爲何要使用FlatBuffers?json
不須要解析/拆包就能夠訪問序列化數據 — FlatBuffers與其餘庫不一樣之處就在於它使用二進制緩衝文件來表示層次數據,這樣它們就能夠被直接訪問而不需解析與拆包,同時還支持數據結構進化(前進、後退兼容性)。緩存
內存高效速度快 — 訪問數據時只須要訪問內存中的緩衝區。它不須要多餘的內存分配(至少在C++是這樣,其餘語言中可能會有變更)。FlatBuffers還適合配合mmap或數據流使用,只須要緩衝區的一部分存儲在內存中。訪問時速度接近原結構訪問,只有一點延遲(一種虛函數表vtable),是爲了容許格式升級以及可選字段。FlatBuffers適合那些花費了大量時間和空間(內存分配)來訪問和構建序列化數據的項目,好比遊戲以及其餘對錶現敏感的應用。能夠參考這裏的基準。數據結構
靈活 — 因爲有可選字段,你不但有很強的升級和回退兼容性(對於歷史悠久的遊戲尤爲重要,不用爲了每一個版本升級全部數據),在選擇要存儲哪些數據以及設計數據結構時也很自由。app
輕量的code footprint — FlatBuffers只須要不多量的生成代碼,以及一個表示最小依賴的很小的頭文件,很容易集成。細節上能夠看上面的基準頁。ide
強類型 — 編譯時報錯,而不須要本身寫重複的容易出錯的運行時檢查。它能夠自動生成有用的代碼。函數
使用方便 — 生成的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。
原文連接:https://medium.freecodecamp.com/why-consider-flatbuffer-over-json-2e4aa8d4ed07