標籤:
你可能會問,既然我們已經有很標準的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完全卡住,所以真實使用時只能在後台線程進行解析。
github源碼地址:https://github.com/amitshekhariitbhu/FlatBuffer
轉自oschina開源中國社區:http://www.oschina.net/news/75092/android-flatbuffers-json
你可能會問,既然我們已經有很標準的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完全卡住,所以真實使用時只能在後台線程進行解析。
【Android】FlatBuffer與Json