我有一個連接到後端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