为什么二进制序列化比xml序列化更快?

时间:2010-10-11 08:08:49

标签: c# .net xml serialization

为什么二进制序列化被认为比xml序列化更快?

5 个答案:

答案 0 :(得分:13)

考虑序列化double,例如:

  • 二进制序列化:从内存地址写入8个字节到流

  • 二进制反序列化:读取相同的8个字节

  • xml序列化:编写标记,转换为文本,编写结束标记 - 几乎三倍的I / O和1000倍的CPU利用率

  • xml反序列化:标记读取/验证,读取字符串将其解析为数字,读取/验证结束标记。 I / O的开销略高,而CPU的开销则更多

答案 1 :(得分:9)

二进制序列化更有效,因为直接写原始数据和XML需要格式,并解析数据以生成有效的XML结构,此外,根据您的对象的数据类型,XML可能具有大量冗余数据。

答案 2 :(得分:8)

实际上,就像所有事情一样 - 取决于数据和序列化程序

通常(尽管可能不明智)人们的意思是BinaryFormatter代表“二元”,但这有许多不足之处:

  • in添加了许多类型元数据(都占用了空间)
  • 默认情况下,它包含字段名称(可以是详细的,特别是对于自动实现的属性)

相反,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

答案 3 :(得分:1)

嗯,首先,XML是一种臃肿的格式。您以二进制形式发送的每个字节都类似于XML中的至少2或3个字节。例如,以二进制形式发送数字“44”,您只需要一个字节。在XML中,你需要一个元素标记,加上两个字节来放置数字:<N>44</N>这是更多的数据。
一个区别是处理消息所需的编码/解码时间。由于二进制数据非常紧凑,因此不会耗费太多时钟周期。如果二进制数据是固定结构,您可以直接将其加载到内存中并从中访问每个元素,而无需解析/解析数据。
XML是一种基于文本的格式,需要处理更多步骤。首先,格式是膨胀的,因此它会占用更多内存。此外,所有数据都是文本,您可能需要二进制形式,因此需要解析XML。无论代码有多快,这种解析仍需要时间来处理。 ASN.1是一种“二进制XML”格式,它为XML提供了一个很好的替代方案,但需要像XML一样进行解析。另外,如果您使用的大多数数据是文本而不是数字,那么二进制格式不会产生很大的差异 另一个速度因素是数据的总大小。当您只加载并保存1 KB的二进制文件或3 KB的XML文件时,您可能不会注意到任何速度差异。这是因为磁盘使用特定大小的块来存储数据。大多数磁盘块中最多可容纳4 KB。因此,对于磁盘而言,它是否需要读取1 KB或3 KB并不重要,因为它读取整个4KB块。但是当二进制文件是1兆字节且XML是3兆字节时,磁盘将需要读取更多块才能读取XML。 (或者写它。)然后,如果您的XML是3 MB或仅2.99 MB或3.01 MB,它甚至更重要 通过TCP / IP传输,大多数二进制数据将是UU编码的。使用UU编码,您的二进制数据将在数据中每3个字节增加1个字节。 XML数据不会被编码,因此尺寸差异变小,因此速度差异变小。尽管如此,二进制数据仍然会更快,因为编码/解码程序可以非常快 基本上,尺寸很重要。 :-)

但是使用XML,您还有另外一种选择。您可以以ZIP文件格式发送和存储XML。 Microsoft Office使用它的新版本执行此操作。 Word文档创建为XML文件,但存储为更大的ZIP文件的一部分。这结合了两者的优点,因为Word文档主要是文本,因此二进制格式不会增加太多的速度。压缩XML使得存储和发送数据的速度更快,只需将其设为二进制即可。更有趣的是,压缩的XML文件最终可能比非压缩的二进制文件小,因此压缩的XML变得更快。 (但由于XML现在是二进制的,所以这是作弊...)

答案 4 :(得分:-1)

I had assumed binary serialization to be faster than xml (based on how verbose xml can be). However I have an opposite observation! I was investigating a performance issue in one of my application and find out that time to serialize is similar between xml and binary. However difference in time to deserialization is extremely huge. xml deserialization takes less than 10 seconds but binary deserialization takes over 10 minutes!

So I guess in theory xml serialization/deseriliaztion is slower than binary but in your application, it depends!

I can't share the actual data but here are the results (in milliseconds)

 Serialization   Deserialization    
 XML    Binary   XML    Binary 
 7,956  9,535    9,112  668,918 
 7,608  9,105    8,386  670,445 
 7,583  9,398    8,372  676,190 
 7,656  9,299    9,783  679,117 
 7,454  9,458    8,219  669,626