2010-10-11 211 views

回答

8

二進制序列化效率更高,因爲直接寫入原始數據和XML需要格式,並且解析數據以生成有效的XML結構,另外還取決於對象的類型數據,XML可能有大量冗餘數據。

11

考慮例如串行化雙:

  • 二進制序列:寫入從存儲器地址的8個字節到流

  • 二進制反序列化:讀取相同的8個字節

  • XML序列:寫入標籤,轉換爲文本,寫結束標籤 - 接近三倍的I/O和1000倍以上的CPU利用率

  • xml反序列化:標記讀取/驗證,讀取字符串解析爲數字,讀取/驗證結束標記。用於I/O多一點開銷,一些對CPU

+2

也可能會提到對字符串對象的內存管理,這些字符串對象通常是在文本格式的序列化或反序列化過程中創建的。這可能會將事情推出CPU緩存,或導致垃圾回收算法踢入或摔碎。 – 2013-05-22 00:22:52

8

其實,像所有的東西 - 這取決於數據,和串行

一般(儘管可能不明智)的人意味着BinaryFormatter爲「二進制」,但這有很多弱點的:

    在默認情況下,它增加了很多類型的元數據(這一切都需要空間)
  • 包含字段名(其可以是冗長,尤其是用於自動地實現的屬性)

相反,XML通常具有開銷如:

  • 標籤添加空間和IO
  • /需要解析標籤(其爲顯着昂貴的)
  • 大量文字編碼的解碼

當然,XML是容易被壓縮,增加CPU但巨大降低帶寬。

但這並不意味着更快;我會參考你的一些樣本統計from here(包括完整的源代碼),我已經註釋了序列化器的基礎(二進制,XML,文本等)。特別要看前兩項結果;它看起來像XmlSerializer在每個價值上都贏得了BinaryFormatter,同時保留了跨平臺的優勢。當然,protobuf然後勝過XmlSerializer; p

這些數字相當吻合ServiceStack's benchmarks, here

BinaryFormatter *** binary 
Length: 1314 
Serialize: 6746 
Deserialize: 6268 

XmlSerializer *** xml 
Length: 1049 
Serialize: 3282 
Deserialize: 5132 

DataContractSerializer *** xml 
Length: 911 
Serialize: 1411 
Deserialize: 4380 

NetDataContractSerializer *** binary 
Length: 1139 
Serialize: 2014 
Deserialize: 5645 

JavaScriptSerializer *** text (json) 
Length: 528 
Serialize: 12050 
Deserialize: 30558 

(protobuf-net v2) *** binary 
Length: 112 
Serialize: 217 
Deserialize: 250 
+0

@FrankHileman不幸的是,人們仍然依靠它,所以它有必要*比較它,即使它在不同的領域玩別的遊戲(並且其他人都在池中) – 2013-05-22 06:30:48

1

嗯,首先,XML是一種臃腫的格式。您以二進制形式發送的每個字節與XML中的至少2或3個字節相似。例如,發送二進制數字「44」,你只需要一個字節。在XML中,您需要一個元素標記,再加上兩個字節來放置數字:<N>44</N>,這是更多的數據。
一個區別是處理消息所需的編碼/解碼時間。由於二進制數據非常緊湊,所以不會消耗太多的時鐘週期。如果二進制數據是一個固定的結構,那麼您可能直接將其加載到內存中,並訪問其中的每個元素,而無需解析/解析數據。
XML是一種基於文本的格式,需要處理幾個步驟。首先,格式臃腫,因此它消耗更多的內存。此外,所有的數據都是文本,你可能需要它們的二進制形式,因此需要解析XML。無論你的代碼有多快,這種解析仍然需要時間來處理。 ASN.1是一種「二進制XML」格式,它爲XML提供了一個很好的選擇,但需要像XML一樣進行解析。另外,如果您使用的大部分數據都是文本,而不是數字,那麼二進制格式不會產生很大的差異。
另一個速度因素是數據的總大小。當您只是加載並保存1 KB的二進制文件或3 KB的XML文件時,您可能不會注意到速度差異。這是因爲磁盤使用特定大小的塊來存儲數據。在大多數磁盤塊中最多可容納4 KB。因此,對於磁盤而言,讀取整個4KB塊後是否需要讀取1 KB或3 KB並不重要。但是,當二進制文件是1兆字節,XML是3兆字節時,磁盤將需要讀取更多的塊才能讀取XML。 (或者編寫它。)然後它甚至很重要,如果您的XML是3 MB或只是2.99 MB或3.01 MB。
通過TCP/IP傳輸,大多數二進制數據將被UU編碼。使用UU編碼,您的二進制數據將隨着數據中每3個字節1個字節而增長。 XML數據不會被編碼,因此尺寸差異變小,因此速度差異變小。儘管如此,二進制數據仍然會更快,因爲編碼/解碼程序可以真正快速。
基本上,大小很重要。 :-)

但是用XML你有另外的選擇。您可以以ZIP文件格式發送和存儲XML。微軟Office使用它的更新版本來做到這一點。 Word文檔是作爲XML文件創建的,但作爲更大的ZIP文件的一部分存儲。這結合了兩全其美,因爲Word文檔主要是文本,因此二進制格式不會增加很多速度。通過將XML壓縮,可以使存儲和發送數據的速度提高很多。更有趣的是,壓縮的XML文件最終可能會比非壓縮的二進制文件小,因此壓縮的XML會變得更快。 (但它是作弊,因爲XML現在是二進制...)