下面對我掌握的的DataSet壓縮方法做一個測試,希望高人有斧正之處,也希望需要的人有借鑑之處。
注:經過壓縮DataSet的WebService就缺少了通用性,請權衡使用之。
測試源碼(僅壓縮部分)和結果如下:
條件:壓縮前的DataSet的大小爲16891323字節(大約16.12M)。
環境:.Net Formatwork 1.1
系統: Windows XP SP1
硬件:P4(2.4G) + 256DDR
方案1:DataSetSurrogate + BinaryFormatter
Public Function DataSetToByte(ByVal DataSet As DataSet) As Byte()
Dim DSS As New DataSetSurrogate(DataSet)
Dim MS As New IO.MemoryStream
Dim BF As New BinaryFormatter
BF.Serialize(MS, DSS)
Dim ReVal() As Byte = MS.ToArray()
MS.Close()
DSS = Nothing
MS = Nothing
BF = Nothing
Return ReVal
End Function
方案2:DataSetSurrogate + BinaryFormatter + SharpZipLib
Public Function DataSetToByte(ByVal DataSet As DataSet) As Byte()
Dim MS As New IO.MemoryStream
Dim ZOS As New ZipOutputStream(MS)
ZOS.PutNextEntry(New ZipEntry(DataSet.DataSetName))
Dim BF As New BinaryFormatter
Dim DSS As DataSetSurrogate = New DataSetSurrogate(DataSet)
BF.Serialize(ZOS, DSS)
ZOS.CloseEntry()
ZOS.Close()
Dim ReVal As Byte() = MS.ToArray
MS.Close()
MS = Nothing
ZOS = Nothing
BF = Nothing
DSS = Nothing
Return ReVal
End Function
方案3:zlib
Public Function DataSetToByte(ByVal DataSet As DataSet) As Byte()
Dim MS As New System.IO.MemoryStream
DataSet.WriteXml(MS, XmlWriteMode.WriteSchema)
Dim ReVal() As Byte = MS.ToArray
MS.Close()
MS = Nothing
Dim zlib As New vbZLib.Compress
zlib.CompressByte(ReVal)
zlib = Nothing
Return ReVal
End Function
結果(壓縮後):
方案1:4420881字節(被壓縮掉大約73.83%),耗時:23200ms
方案2: 696881字節(被壓縮掉大約95.87%),耗時:26621ms
方案3: 422990字節(被壓縮掉大約97.50%),耗時: 680ms
看來,無論壓縮率還是耗時都是方案3最優,但是使用了第三方組件。前兩個方案對CPU資源佔用率的也讓人無法接受。
作者:魏滔序 (zhongnian_wei&163.com)