小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

為什么Android開發(fā)者應(yīng)該使用FlatBuffers替代JSON?

 quasiceo 2016-07-14

為什么Android開發(fā)者應(yīng)該使用FlatBuffers替代JSON?

作者 Amit Shekhar ,譯者 程大治 發(fā)布于 2016年7月8日 | 首屆應(yīng)用性能管理大會(huì) APMCon,聚焦國(guó)內(nèi)外性能優(yōu)化先進(jìn)技術(shù)。 1 討論

你可能會(huì)問,既然我們已經(jīng)有很標(biāo)準(zhǔn)的JSON以及轉(zhuǎn)換庫(kù)比如GSON和Jackson,為什么還要使用新的工具呢?

不妨先試一下FlatBuffers,然后你就會(huì)發(fā)現(xiàn)它比JSON快得多。

FlatBuffers是什么?

FlatBuffers是一個(gè)高效的跨平臺(tái)序列化類庫(kù),可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google開發(fā)的,是為了應(yīng)用在游戲開發(fā),以及其他注重性能的應(yīng)用上。

為什么要使用FlatBuffers?

  • 不需要解析/拆包就可以訪問序列化數(shù)據(jù) — FlatBuffers與其他庫(kù)不同之處就在于它使用二進(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++是這樣,其他語(yǔ)言中可能會(huì)有變動(dòng))。FlatBuffers還適合配合mmap或數(shù)據(jù)流使用,只需要緩沖區(qū)的一部分存儲(chǔ)在內(nèi)存中。訪問時(shí)速度接近原結(jié)構(gòu)訪問,只有一點(diǎn)延遲(一種虛函數(shù)表vtable),是為了允許格式升級(jí)以及可選字段。FlatBuffers適合那些花費(fèi)了大量時(shí)間和空間(內(nèi)存分配)來訪問和構(gòu)建序列化數(shù)據(jù)的項(xiàng)目,比如游戲以及其他對(duì)表現(xiàn)敏感的應(yīng)用。可以參考這里的基準(zhǔn)。

  • 靈活 — 由于有可選字段,你不但有很強(qiáng)的升級(jí)和回退兼容性(對(duì)于歷史悠久的游戲尤其重要,不用為了每個(gè)版本升級(jí)所有數(shù)據(jù)),在選擇要存儲(chǔ)哪些數(shù)據(jù)以及設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)也很自由。

  • 輕量的code footprint — FlatBuffers只需要很少量的生成代碼,以及一個(gè)表示最小依賴的很小的頭文件,很容易集成。細(xì)節(jié)上可以看上面的基準(zhǔn)頁(yè)。

  • 強(qiáng)類型 — 編譯時(shí)報(bào)錯(cuò),而不需要自己寫重復(fù)的容易出錯(cuò)的運(yùn)行時(shí)檢查。它可以自動(dòng)生成有用的代碼。

  • 使用方便 — 生成的C++代碼允許精簡(jiǎn)訪問與構(gòu)建代碼。還有可選的用于實(shí)現(xiàn)圖表解析、類似JSON的運(yùn)行時(shí)字符串展示等功能的方法。(后者比JSON解析庫(kù)更快,內(nèi)存效率更高)

  • 代碼跨平臺(tái)且沒有依賴 — C++代碼可以運(yùn)行在任何近代的gcc/clang和VS2010上。同時(shí)還有用于測(cè)試和范例的構(gòu)建文件(Android中.mk文件,其他平臺(tái)是cmake文件)。

都有誰使用FlatBuffers?

  • BobbleApp,印度第一貼圖App。我們?cè)贐obbleApp中使用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在他們所有的庫(kù)和游戲中大量使用FlatBuffers。

App性能有多大提高?

  • 解析速度 解析一個(gè)20KB的JSON流(這差不多是BobbleApp的返回大?。┬枰?5ms,超過了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)建了很多小對(duì)象,在我們的試驗(yàn)中,解析20kb的JSON流時(shí),要分配大約100kb的瞬時(shí)存儲(chǔ),對(duì)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./why-consider-flatbuffer-over-json-2e4aa8d4ed07


感謝徐川對(duì)本文的審校。

給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,請(qǐng)郵件至editors@cn.。也歡迎大家通過新浪微博(@InfoQ@丁曉昀),微信(微信號(hào):InfoQChina)關(guān)注我們。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多