第一种情况:
DataSet + DataSetSurrogate + BinaryFomatter
返回的Byte数量为8 801 983
时间:调用WebService:10+秒左右,解压:2秒左右
第二种情况:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
返回的Byte数量为1 259 938
时间:调用WebService:14+秒左右,解压:4+秒左右
当数据条数增加为10W的时候:
第一种情况:
DataSet + DataSetSurrogate + BinaryFomatter
时间:调用WebService:40+秒左右,解压:5秒左右
第二种情况:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
时间:调用WebService:47+秒左右,解压:10+秒左右
代码:
第一种情况:
DataSet + DataSetSurrogate + BinaryFomatter
[WebMethod]
public byte [] GetDataSetZip()
{
string connString = @”server=localhost;database=NorthWind;uid=sa;pwd=vault”;
string sqlString = @” SELECT top 100000* FROM Orders”;
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter apter = new SqlDataAdapter(sqlString,conn);
DataSet ds = new DataSet();
apter.Fill(ds);
DataSetSurrogate dss = new DataSetSurrogate(ds);
MemoryStream s= new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s,dss);
byte[] ret = s.ToArray();
return ret;
}
第二种情况:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
[WebMethod]
public byte [] GetDataSetZip_SharpZipLib()
{
string connString = @”server=localhost;database=NorthWind;uid=sa;pwd=vault”;
string sqlString = @” SELECT top 100000* FROM Orders”;
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter apter = new SqlDataAdapter(sqlString,conn);
DataSet ds = new DataSet();
apter.Fill(ds);
MemoryStream ms = new MemoryStream();
ZipOutputStream zos = new ZipOutputStream(ms);
zos.PutNextEntry(new ZipEntry(ds.DataSetName));
BinaryFormatter bf = new BinaryFormatter();
DataSetSurrogate dss = new DataSetSurrogate(ds);
bf.Serialize(zos, dss);
zos.CloseEntry();
zos.Close();
byte[] ret = ms.ToArray();
ms.Close();
return ret;
}
如果是在本地局域网WebService测试的话,网络传输时间影响比较小,所以压缩消耗的时间可能大于减少容量节约下来的时间,所以才导致测试结果如此,找个不太好的外部网络环境作测试,压缩数据集就可以很大程度提高传输效率了
在比较之前,你要选确定条件,比方网络带宽
如果你是局域网,速度很快,当然压不压缩都一样,压缩反而增加了CPU处理时间
如果是30几K的猫,那么光传输8M的数据就是N长时间,那么就会发现压缩的好处
使用WebServices传输DataSet的瓶颈是在通讯上,因为数据量太大,所以使用压缩见效
public class Zlib
{
[DllImport(“zlibwapi.dll”)]
public extern static int compress(out Byte[] dests, out long lenDest, Byte[] srcs, long lenSrc);
}
[WebMethod]
public byte [] GetDataSetZip_zlib()
{
string connString = @”server=localhost;database=NorthWind;uid=sa;pwd=vault”;
string sqlString = @” SELECT top 100* FROM Orders”;
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter apter = new SqlDataAdapter(sqlString,conn);
DataSet ds = new DataSet();
apter.Fill(ds);
DataSetSurrogate dss = new DataSetSurrogate(ds);
MemoryStream s= new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s,dss);
byte[] srcByte = s.ToArray();
long lenDest = srcByte.Length + (long)(srcByte.Length * 0.01) + 13;
byte[] destByte = new byte[lenDest];
int ret;
try
{
ret = Zlib.compress(out destByte,out lenDest,srcByte,srcByte.Length+1);
//代码运行到这里程序就崩溃了。
}
catch(Exception e)
{
;
}
return destByte;
}