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

添加Interval时HttpWebRequest变慢分享

时间:2023-04-10 22:09:20 C#

HttpWebRequest在添加Interval时变慢测试下载网页源的不同可能性我得到了以下结果(google.com,9gag.com的平均时间以毫秒为单位):所以对于我的9gag客户端,我决定使用gzipHttpWebRequest。问题是,在我的实际程序中实现后,请求的时间是原来的两倍多。仅在两个请求之间添加Thread.Sleep时也会出现此问题。编辑:只是改进了一些代码,仍然是同样的问题:当我在循环中运行时,当我在请求之间添加延迟时请求需要更长的时间for(inti=0;i<100;i++){getWebsite("http://9gag.com/");}每个请求大约需要250毫秒。for(inti=0;i<100;i++){getWebsite("http://9gag.com/");线程.睡眠(1000);}每个请求大约需要610毫秒。privatestringgetWebsite(stringUrl){秒表stopwatch=Stopwatch.StartNew();HttpWebRequesthttp=(HttpWebRequest)WebRequest.Create(Url);http.AutomaticDecompression=DecompressionMethods.GZip|减压方法.Deflate;字符串html=string.Empty;(HttpWebResponsewebResponse=(HttpWebResponse)http.GetResponse())使用(StreamresponseStream=webResponse.GetResponseStream())使用(StreamReaderreader=newStreamReader(responseStream)){html=reader.读到结束();调试。WriteLine(.ElapsedMilliseconds);返回html;}任何想法如何解决这一问题?也许尝试一下,尽管它可能只会帮助您处理单个请求,并且在执行多线程版本时实际上会使事情变得更糟。ServicePointManager.UseNagleAlgorithm=false;这是HttpWebRequest类的MSDN文档中的引述另一个可能会影响性能的选项是使用UseNagleAlgorithm属性。当此属性设置为true时,TCP/IP将尝试对HTTP连接使用TCPNagle算法。Nagle的算法在发送TCP数据包时聚合数据。在通过网络发送数据之前,它会将小消息序列累积到较大的TCP数据包中。使用Nagle的算法可以优化网络资源的使用,虽然在某些情况下性能也会有所降低。通常,对于恒定的高吞吐量,可以使用Nagle算法实现性能改进。但是,对于吞吐量较小的应用程序,可能会出现性能下降。应用程序通常不需要将UseNagleAlgorithm属性的默认值设置为true。但是,如果应用程序使用低延迟连接,将此属性设置为false可能会有所帮助。我认为您可能正在泄漏资源,因为您没有在每次方法调用时丢弃所有IDisposable对象。提供此版本并尝试查看它是否为您提供更一致的执行时间。以上是C#学习教程:加入Interval后,HttpWebRequest会减慢所有共享的内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——publicstringgetWebsite(stringUrl){Stopwatchstopwatch=Stopwatch.StartNew();HttpWebRequesthttp=(HttpWebRequest)WebRequest.Create(Url);http.Headers.Add(HttpRequestHeader.AcceptEncoding,"gzip,deflate");字符串html=string.Empty;使用(HttpWebResponsewebResponse=(HttpWebResponse)http.GetResponse()){使用(StreamresponseStream=webResponse.GetResponseStream()){StreamdecompressedStream=null;if(webResponse.ContentEncoding.ToLower().Contains("gzip"))decompressedStream=newGZipStream,response(CompressionMode.Decompress);elseif(webResponse.ContentEncoding.ToLower().Contains("deflate"))decompressedStream=newDeflateStream(responseStream,CompressionMode.Decompress);如果(decompressedStream!=null){使用(StreamReaderreader=newStreamReader(decompressedStream,编码。默认)){html=rleader.ReadToEnd();}decompressedStream.Dispose();}}}Debug.WriteLine(秒表.ElapsedMilliseconds);返回html;,转载请注明出处: