GZipStream的解压缩性能很差

Arm*_*rat 5 c# compression performance gzipstream

我有一个连接到后端WAS服务器的.NET 2.0 WinForms应用程序。我正在使用GZipStream解码从对服务器进行的HttpWebRequest调用返回的数据。返回的数据是Apache压缩的压缩CSV。整个服务器堆栈是Hibernate-> EJB-> Spring-> Apache。

对于较小的响应,性能很好(<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();
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

编辑1

基于Lucero的评论,我将Decompress方法修改为以下内容,但是在实例化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();
   }
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

根据上面的代码,任何人都可以看到任何问题吗?这对我来说似乎很基本,但是却让我发疯。

编辑2

我使用ANTS Profiler对应用程序进行了性能分析,在60年代的解压缩过程中,CPU接近于零,内存使用率也没有变化。

编辑3

实际的减速似乎是在读取

this.Response.GetResponseStream
整个60秒钟都花在了将响应流加载到MemoryStream中。在那里,对GZipStream的调用很快。
编辑4

我发现使用HttpWebRequest.AutomaticDecompression会出现相同的性能问题,因此我在关闭此问题。

Luc*_*ero 1

尝试首先将数据加载到 MemoryStream 中,然后解压缩 MemoryStream...