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

问题描述 投票:9回答:5

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

c# .net xml serialization
5个回答
9
投票

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


13
投票

考虑序列化double,例如:

  • 二进制序列化:从内存地址写入8个字节到流
  • 二进制反序列化:读取相同的8个字节
  • xml序列化:编写标记,转换为文本,编写结束标记 - 几乎三倍的I / O和1000倍的CPU利用率
  • xml反序列化:标记读取/验证,读取字符串将其解析为数字,读取/验证结束标记。 I / O的开销稍微增加,而CPU的开销则更多

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

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现在是二进制而作弊...)


-1
投票

我假设二进制序列化比xml更快(基于详细的xml可以)。但是我有一个相反的观察!我正在调查我的一个应用程序中的性能问题,并发现序列化的时间在xml和二进制之间是相似的。然而,反序列化的时间差异非常大。 xml反序列化只需不到10秒,但二进制反序列化需要10多分钟! 所以我认为理论上xml序列化/ deseriliaztion比二进制慢,但在你的应用程序中,它取决于! 我无法分享实际数据,但这里是结果(以毫秒为单位)

 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 
© www.soinside.com 2019 - 2024. All rights reserved.