ASP.NET DataTable序列化性能比较

在开发ASP.NETWeb Forms应用程序时,经常需要处理来自WCF服务的大量DataTable对象,并且这些对象需要在用户界面(UI)上进行直接绑定。虽然这种做法可能不是最优的,但由于UI的复杂性和业务逻辑直接引用了大量的DataTable字段,重写这部分代码的成本和风险都非常高。因此,寻求一种最佳的DataTable序列化方法。

本文将介绍几种不同的序列化方法,并比较它们在性能和一致性方面的表现。所有的测试都是在一台配置为Windows 10 Pro x64、Intel Core i3 540 @ 3.06 Ghz CPU和8 GB的DDR3 RAM @ 1333 Mhz的计算机上进行的。

测试的序列化方法

以下是测试的几种序列化方法:

  • DataTable的WriteXml/ReadXml方法
  • 二进制格式化器(Binary Formatter)
  • 压缩二进制格式化器(Compressed Binary Formatter)
  • 协议缓冲区(Protocol Buffers)
  • 压缩协议缓冲区(Compressed Protocol Buffers)
  • 快速序列化器(Fast Serializer)
  • 轻量级序列化器(Lightweight Serializer)
  • Drew DataSet格式化器(Drew DataSet Formatter)
  • 自定义DataTable格式化器(DataTable Custom Formatter)

序列化方法的测试结果

对每种序列化方法进行了多次测试,以确保结果的一致性和准确性。测试对象包括人工生成的DataTable对象和从AdventureWorks2012 SQL Server示例数据库的生产模式中检索到的对象。

以下是对一个包含36列和10,000行(总共360,000个单元格)的大型数据集进行序列化和反序列化的测试结果:

描述 大小 (字节) 序列化 (毫秒) 反序列化 (毫秒)
DataTableWriteXml/ReadXml 方法 13,435,801 411.941 ± 4.932 467.279 ± 3.059
二进制格式化器 2,660,024 217.003 ± 1.254 317.036 ± 6.738
压缩二进制格式化器 821,369 232.951 ± 1.044 323.181 ± 2.818
协议缓冲区 失败 失败 失败
快速序列化器 1,696,752 74.906 ± 0.782 106.662 ± 0.925
轻量级序列化器 3,324,311 339.926 ± 8.636 700.616 ± 8.806
Drew DataSet格式化器 3,182,058 376.337 ± 1.704 668.623 ± 10.188
自定义DataTable格式化器 535,194 60.743 ± 0.264 127.290 ± 0.929

从测试结果可以看出,自定义DataTable格式化器在序列化和反序列化大型数据集时表现最好,无论是在大小、序列化时间还是反序列化时间上都优于其他方法。

以下是对一个包含4列和10行(总共40个单元格)的小型数据集进行序列化和反序列化的测试结果:

描述 大小 (字节) 序列化 (毫秒) 反序列化 (毫秒)
DataTableWriteXml/ReadXml 方法 3,707 0.116 ± 0.000 0.286 ± 0.001
二进制格式化器 7,609 0.272 ± 0.000 0.361 ± 0.000
压缩二进制格式化器 3,549 0.367 ± 0.021 0.414 ± 0.010
协议缓冲区 1,354 0.068 ± 0.000 0.145 ± 0.001
快速序列化器 1,420 0.017 ± 0.000 0.036 ± 0.000
轻量级序列化器 2,559 0.127 ± 0.000 0.274 ± 0.002
Drew DataSet格式化器 2,192 0.060 ± 0.000 0.132 ± 0.000
自定义DataTable格式化器 1,436 0.025 ± 0.000 0.050 ± 0.000

在小型数据集的测试中,快速序列化器在序列化和反序列化时间上表现最好,而自定义DataTable格式化器在大小上表现最好。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485