백엔드 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();
}
}
}
편집 한
을, 나는 다음에 압축 해제 방법을 수정 ,하지만 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
편집 나는 개미 프로파일 러를 사용하여 응용 프로그램을 프로파일 링, 및 압축 해제의 60 년대 동안, CPU는 거의 제로이며, 메모리 사용량이 변경되지 않습니다.
편집 3 실제 둔화
this.Response.GetResponseStream전체 60 년대의 읽기 동안 것으로 보인다
MemoryStream을에 응답 스트림을로드 소요됩니다. GZipStream을 호출하면 GZipStream에 대한 호출이 빠릅니다.
편집 4
나는 HttpWebRequest.AutomaticDecompression를 사용하여 동일한 성능 문제를 전시 것을 발견, 그래서 나는이 질문을 폐쇄하고있다.
압축 해제가 올바른 문제가 아니기 때문에 투표를 종료하십시오. – Armbrat
메모리 스트림을 추가해도 성능이 향상되지 않는다고 가정하면 실제로 메모리 스트림에 전체 응답을 기록하는 데 걸리는 시간과 별도로 압축하는 데 걸리는 시간을 측정하고 있습니까? CPU가 0에 가깝고 병목 현상이 지퍼가 아니라 응답을 다운로드 할 수있는 속도가 빠르다는 것이 나의 의구심입니다. –
이 문제를 해결 했습니까? – rolls