Google Protocol Buffer

原文連接:http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

1.ProtocolBuffers是啥

 Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。目前提供了 C++、Java、Python 三種語言的 API。

2.ProtocolBuffers 的有點

XML的自我解析性很強,也就是看了這個字段,就知道這個字段是啥意思,Json的解析框架很多,可閱讀性雖然不如XML,拓展性也不如XML,但是解析起來方便,目前Android端有Gson FastJson等一大片的解析框架,相對與XML的解析會更加的簡單快捷,雖然損失了閱讀性能,作爲目前移動端跟服務器交互的主流數據格式,protocolBuffer有哪些優點呢?

3.ProtocolBuffer的優點

protocolBuffer的優點就是快,快主要體現在什麼地方呢?假設你創建一個對象,將對象序列化爲內存中的字節序列,在後再反序列化出來,當然一次的操作可能看出來的差距會比較小,就像假設這個操作是0.1的話,一個是0.2s 的話,這些時間上的差距,可能用肉眼根本就沒辦法區分哪個的速度會更快一些,但是重複操作上千次,上萬次之後,你就會發現時間的差距了,用累計法可以計算,在數據的傳輸過程中,需要多次進行序列化與反序列化,那麼時間差距就出來了,protocolBuffer它以高效的二進制方式存儲,比XML體積要小3-10倍,比XML的速度要快20-100倍。

4.protocolBuffer爲啥會比Java的序列化要快很多

爲啥protocolBuffer會比XML小很多跟快很多,這個要從protocolBuffer的封包與解包說起,先說封包的過程吧,也就是發送數據的時候,Encoding的過程,Varint 是一種緊湊的數字表示方法,它用一個字節或多個字節來表示一個數字,值越小的數字,使用越少的字節數,這能減少表示數字的字節數,比如一個int32 類型的數字,一般需要4個byte 來表示,但是如果使用Varint的話,則可以用一個Byte來表示,這樣不好的地方在於如果是大的數字的話,可能會使用5Byte來表示,當然一般在數字中不可能全部出現都是大數的情況

Varint的每個最高位的bit 有特殊的意義,如果最高位bit 爲1的話則表示後續的Byte 也是該數字的一部分,反之最高位bit 如果爲0的話,則後續的數字不是改數字的一部分,這樣就會減少很多的空間,讓數字的表示,每位bit 都能夠能近其所用,數字的表示更加的緊密,這就是爲什麼體積更小的原因

封包的速度

首先了解下XML的封包的過程,XML需要從文件中讀取字符串,在轉換成XML文檔對象結構模型,之後再從XML文檔對象結構模型中讀取指定節點的字符串,然後再將這些字符串轉換成指定類型變量,這個過程非常的複雜。其中將XML轉換成文檔對象結構模型的過程需要完成詞法與文法分析等大量耗費CPU的工作

反觀protocolBuffer只需要將一個簡單的二進制序列,按照指定的格式讀取到C++對應的結構類型中就可以了



任何東西存在都會有它的可行性,就像JSON XML 之類的通信格式,如果某個東西,存在的是一無是處的話,慢慢的肯定會被淘汰,就像生物進化論一般,各有各自的優點與缺點,按照自己的需求選取可行的方案纔是最合適的,不過個人覺得ProtocolBuffer協議有些難懂,對於菜鳥級別的碼農剛開始接觸的時候,會有些難以理解,而且如果數據格式錯誤的話,可能會倒置不知道是服務器的錯誤還是客戶端的錯誤,因爲這個根本沒辦法通過抓包來確定是哪個地方出問題了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章