from:http://www.oschina.net/news/75092/android-flatbuffers-json
你可能會(huì)問,既然我們已經(jīng)有很標(biāo)準(zhǔn)的JSON以及轉(zhuǎn)換庫比如GSON和Jackson,為什么還要使用新的工具呢?
不妨先試一下FlatBuffers,然后你就會(huì)發(fā)現(xiàn)它比JSON快得多。
FlatBuffers是什么?
FlatBuffers是一個(gè)高效的跨平臺(tái)序列化類庫,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google開發(fā)的,是為了應(yīng)用在游戲開發(fā),以及其他注重性能的應(yīng)用上。
為什么要使用FlatBuffers?
不需要解析/拆包就可以訪問序列化數(shù)據(jù) — FlatBuffers與其他庫不同之處就在于它使用二進(jìn)制緩沖文件來表示層次數(shù)據(jù),這樣它們就可以被直接訪問而不需解析與拆包,同時(shí)還支持?jǐn)?shù)據(jù)結(jié)構(gòu)進(jìn)化(前進(jìn)、后退兼容性)。
內(nèi)存高效速度快 — 訪問數(shù)據(jù)時(shí)只需要訪問內(nèi)存中的緩沖區(qū)。它不需要多余的內(nèi)存分配(至少在C++是這樣,其他語言中可能會(huì)有變動(dòng))。FlatBuffers還適合配合 mmap或數(shù)據(jù)流使用,只需要緩沖區(qū)的一部分存儲(chǔ)在內(nèi)存中。訪問時(shí)速度接近原結(jié)構(gòu)訪問,只有一點(diǎn)延遲(一種虛函數(shù)表vtable),是為了允許格式升級以 及可選字段。FlatBuffers適合那些花費(fèi)了大量時(shí)間和空間(內(nèi)存分配)來訪問和構(gòu)建序列化數(shù)據(jù)的項(xiàng)目,比如游戲以及其他對表現(xiàn)敏感的應(yīng)用。可以參 考這里的基準(zhǔn)。
靈活 — 由于有可選字段,你不但有很強(qiáng)的升級和回退兼容性(對于歷史悠久的游戲尤其重要,不用為了每個(gè)版本升級所有數(shù)據(jù)),在選擇要存儲(chǔ)哪些數(shù)據(jù)以及設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)也很自由。
輕量的code footprint — FlatBuffers只需要很少量的生成代碼,以及一個(gè)表示最小依賴的很小的頭文件,很容易集成。細(xì)節(jié)上可以看上面的基準(zhǔn)頁。
強(qiáng)類型 — 編譯時(shí)報(bào)錯(cuò),而不需要自己寫重復(fù)的容易出錯(cuò)的運(yùn)行時(shí)檢查。它可以自動(dòng)生成有用的代碼。
使用方便 — 生成的C++代碼允許精簡訪問與構(gòu)建代碼。還有可選的用于實(shí)現(xiàn)圖表解析、類似JSON的運(yùn)行時(shí)字符串展示等功能的方法。(后者比JSON解析庫更快,內(nèi)存效率更高)
代碼跨平臺(tái)且沒有依賴 — C++代碼可以運(yùn)行在任何近代的gcc/clang和VS2010上。同時(shí)還有用于測試和范例的構(gòu)建文件(Android中.mk文件,其他平臺(tái)是cmake文件)。
都有誰使用FlatBuffers?
BobbleApp,印度第一貼圖App。我們在BobbleApp中使用FlatBuffers后App的性能明顯增強(qiáng)。
Cocos2d-x,第一開源移動(dòng)游戲引擎,使用FlatBuffers來序列化所有的游戲數(shù)據(jù)。
Facebook使用FlatBuffers在Android App中進(jìn)行客戶端服務(wù)端的溝通。他們寫了一篇文章來描述FlatBuffers是如何加速加載內(nèi)容的。
Google的Fun Propulsion Labs在他們所有的庫和游戲中大量使用FlatBuffers。
App性能有多大提高?
解析速度 解析一個(gè)20KB的JSON流(這差不多是BobbleApp的返回大小)需要35ms,超過了UI刷新間隔也就是16.6ms。如果解析JSON的話,我們就在滑動(dòng)時(shí)就會(huì)因?yàn)橐獜拇疟P加載緩存而導(dǎo)致掉幀(視覺上的卡頓)。
解析器初始化 一個(gè)JSON解析器需要先構(gòu)建字段映射再進(jìn)行解析,這會(huì)花100ms到200ms,很明顯的拖緩App啟動(dòng)時(shí)間。
垃圾回收 在解析JSON時(shí)創(chuàng)建了很多小對象,在我們的試驗(yàn)中,解析20kb的JSON流時(shí),要分配大約100kb的瞬時(shí)存儲(chǔ),對Java內(nèi)存回收造成很大壓力。
FlatBuffers vs JSON
我嘗試使用FlatBuffers和JSON解析4mb的JSON文件。
FlatBuffers花了1-5ms,JSON花了大約2000ms。在使用FlatBuffers期間Android App中沒有GC,而在使用JSON時(shí)發(fā)生了很多次GC。在使用JSON時(shí)UI完全卡住,所以真實(shí)使用時(shí)只能在后臺(tái)線程進(jìn)行解析。

如何使用FlatBuffer呢?
我在我的GitHub中寫了一個(gè)示例,里面手把手教你如何使用FlatBuffer。
原文鏈接:https://medium.freecodecamp.com/why-consider-flatbuffer-over-json-2e4aa8d4ed07
稿源:infoQ 作者Amit Shekhar 譯者程大治