当前位置: 首页 > 编程语言 > C#

GZipStream的解压性能差分享

时间:2023-04-10 16:38:01 C#

GZipStream的解压性能差我有一个连接到后端WAS服务器的.NET2.0WinForms应用程序。我正在使用GZipStream解码从对服务器发出的HttpWebRequest调用返回的数据。返回的数据是Apache正在压缩的压缩CSV。整个服务器堆栈是Hibernate->EJB->Spring->Apache。对于小响应,性能很好(150KB响应,解压缩需要60多秒。大部分时间似乎花在GZipStream构造函数中。下面是显示我从HttpWebResponse调用中获取响应流的位置的代码:使用(流stream=this.Response.GetResponseStream()){if(this.CompressData&&this.Response.ContentEncoding=="gzip"){//解压响应byte[]b=Decompress(stream);this.ResponseBody=encoding.GetString(b);}else{//使用(StreamReadersr=newStreamReader(stream)){this.ResponseBody=sr.ReadToEnd();}}}编辑1根据Lucero的评论,我将流作为字符串读取将Decompress方法修改为以下内容,但我没有看到在实例化GZipStream之前将ResponseStream加载到MemoryStream中有任何性能优势。privatestaticbyte[]Decompress(Streamstream){使用(MemoryStreamms=newMemoryStream()){byte[]buffer=newbyte[4096];int读取=0;while((read=stream.Read(buffer,0,buffer.Length))>0){ms.Write(buffer,0,read);}ms.Seek(0,SeekOrigin.Begin);使用(GZipStreamgzipStream=newGZipStream(ms,CompressionMode.Decompress,false)){read=0;缓冲区=新字节[4096];使用(MemoryStreamoutput=newMemoryStream()){while((read=gzipStream.Read(buffer,0,buffer.Length))>0){output.Write(buffer,0,read);}返回输出.ToArray();}}}}基于上面的代码,任何人都可以看到任何问题吗?这对我来说似乎很基本,但它让我发疯。编辑2我使用ANTSProfiler分析了应用程序,在60年代的解压缩过程中,CPU接近于零,内存使用率没有改变。编辑3实际的减速似乎是在读取this.Response.GetResponseStream期间将响应流加载到MemoryStream中花费了整整60秒。一旦它在那里,对GZipStream的调用就会很快。编辑4我发现使用HttpWebRequest.AutomaticDecompression表现出相同的性能问题,所以我关闭了这个问题。首先尝试将数据加载到MemoryStream中,然后解压缩MemoryStream...DotNetZip有一个GZipStream类,可以用作System.IO.Compression.GZipStream的替代品。DotNetZip是免费的。注意:如果您只是在执行GZipStream,那么您需要Ionic.Zlib.dll,而不是Ionic.Zip.dll。很抱歉没有直接回答您的问题,但是您看过SharpZip了吗?我发现它比Gzip更容易使用。如果您在解决当前问题时遇到困难,也许它可以更好地执行任务。http://www.icsharpcode.net/OpenSource/SharpZipLib/我将我的三分钱投入到这个主题中只是为了通知C#用户7Zip似乎在纯C#中公开其API。我想你们都非常了解7Zip工具,至少对我来说是这样,无论它的API设计得多么好或多么糟糕——知道这将对提高ZIP文件/流的性能有很大帮助。参考:http://www.splinter.com.au/compressing-using-the-7zip-lzma-algorithm-in/以上是C#学习教程:GZipStream的解压性能很差。会用到,需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: