我有一个连接到后端WAS服务器的.NET 2.0 WinForms应用程序。我正在使用GZipStream解码从服务器发出的HttpWebRequest调用返回的数据。返回的数据是压缩的CSV,这是Apache正在压缩的。整个服务器堆栈是Hibernate - > EJB - > Spring - > Apache。GZipStream解压缩性能差
对于小的响应,性能很好(< 50ms)。当我获得大于150KB的响应时,需要60秒以上才能解压缩。大部分时间似乎都花在GZipStream的构造函数中。
这是代码表示从哪里获得从HttpWebResponse呼叫响应流:
using (Stream stream = this.Response.GetResponseStream())
{
if (this.CompressData && this.Response.ContentEncoding == "gzip")
{
// Decompress the response
byte[] b = Decompress(stream);
this.ResponseBody = encoding.GetString(b);
}
else
{
// Just read the stream as a string
using (StreamReader sr = new StreamReader(stream))
{
this.ResponseBody = sr.ReadToEnd();
}
}
}
编辑1
基于来自卢塞罗注释,我修改了解压缩方法,以下面的,但是在实例化GZipStream之前,我没有看到将ResponseStream加载到MemoryStream中带来的任何性能优势。
private static byte[] Decompress(Stream stream)
{
using (MemoryStream ms = new MemoryStream())
{
byte[] buffer = new byte[4096];
int read = 0;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
ms.Seek(0, SeekOrigin.Begin);
using (GZipStream gzipStream = new GZipStream(ms, CompressionMode.Decompress, false))
{
read = 0;
buffer = new byte[4096];
using (MemoryStream output = new MemoryStream())
{
while ((read = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
return output.ToArray();
}
}
}
}
根据上面的代码,任何人都可以看到任何问题吗?这对我来说似乎很基本,但是这让我感到非常紧张。
编辑2
予成型使用ANTS探查该应用程序,并减压60年代期间,CPU是接近零和存储器使用量不变化。
编辑3
实际减速似乎是
this.Response.GetResponseStream整个60年代读取期间花费加载响应流进MemoryStream的。一旦它在那里,GZipStream的呼叫很快。
编辑4
我发现,使用HttpWebRequest.AutomaticDecompression出现相同的性能问题,所以我关闭了这个问题。
投票关闭,因为解压缩不是正确的问题。 – Armbrat 2009-10-06 19:28:17
当你说添加内存流并没有提高性能时,你是否实际上测量了将整个响应写入内存流所需的时间与分开压缩的时间?我的怀疑是,鉴于CPU接近零,瓶颈不是压缩,但你可以下载响应的速度有多快。 – 2014-05-26 18:38:48
你解决了这个问题吗? – rolls 2018-02-08 02:43:19