测试下载网页来源的不同可能性我得到了以下结果(google.com,9gag.com的平均时间毫秒):
因此,对于我的9gag客户端,我决定采用gzip HttpWebRequest。问题是,在我的实际程序中实现后,请求所需的时间超过两倍 只在两个请求之间添加Thread.Sleep时也会出现问题。
修改
刚刚对代码进行了一些改进,仍然存在同样的问题:当在循环中运行时,当我在请求之间添加延迟时,请求需要更长的时间
for(int i = 0; i < 100; i++)
{
getWebsite("http://9gag.com/");
}
每个请求大约需要250毫秒。
for(int i = 0; i < 100; i++)
{
getWebsite("http://9gag.com/");
Thread.Sleep(1000);
}
每个请求大约需要610毫秒。
private string getWebsite(string Url)
{
Stopwatch stopwatch = Stopwatch.StartNew();
HttpWebRequest http = (HttpWebRequest)WebRequest.Create(Url);
http.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
string html = string.Empty;
using (HttpWebResponse webResponse = (HttpWebResponse)http.GetResponse())
using (Stream responseStream = webResponse.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
html = reader.ReadToEnd();
}
Debug.WriteLine(stopwatch.ElapsedMilliseconds);
return html;
}
有什么想法可以解决这个问题吗?
答案 0 :(得分:5)
也许尝试一下,虽然它可能只会帮助您处理单个请求,但实际上在执行多线程版本时会让事情变得更糟。
ServicePointManager.UseNagleAlgorithm = false;
以下是来自HttpWebRequest Class
的MSDN文档的引用可能对性能产生影响的另一个选择是使用 UseNagleAlgorithm属性。当此属性设置为true时, TCP / IP将尝试使用TCP Nagle算法进行HTTP连接。 Nagle算法在发送TCP数据包时聚合数据。它 之前将小消息序列累积到更大的TCP数据包中 数据通过网络发送。使用Nagle算法可以 尽管在某些情况下,优化网络资源的使用 性能也可能降低。一般用于恒定的高容量 吞吐量,使用Nagle实现性能提升 算法。但对于较小的吞吐量应用程序,降级 可以看到表现。
应用程序通常不需要更改默认值 UseNagleAlgorithm属性,设置为true。但是,如果一个 应用程序正在使用低延迟连接,它可能有助于设置此 财产到假。
答案 1 :(得分:1)
我认为您可能会泄漏资源,因为您没有在每次方法调用时丢弃所有IDisposable对象。
提供此版本并尝试查看它是否为您提供更一致的执行时间。
public string getWebsite( string Url )
{
Stopwatch stopwatch = Stopwatch.StartNew();
HttpWebRequest http = (HttpWebRequest) WebRequest.Create( Url );
http.Headers.Add( HttpRequestHeader.AcceptEncoding, "gzip,deflate" );
string html = string.Empty;
using ( HttpWebResponse webResponse = (HttpWebResponse) http.GetResponse() )
{
using ( Stream responseStream = webResponse.GetResponseStream() )
{
Stream decompressedStream = null;
if ( webResponse.ContentEncoding.ToLower().Contains( "gzip" ) )
decompressedStream = new GZipStream( responseStream, CompressionMode.Decompress );
else if ( webResponse.ContentEncoding.ToLower().Contains( "deflate" ) )
decompressedStream = new DeflateStream( responseStream, CompressionMode.Decompress );
if ( decompressedStream != null )
{
using ( StreamReader reader = new StreamReader( decompressedStream, Encoding.Default ) )
{
html = reader.ReadToEnd();
}
decompressedStream.Dispose();
}
}
}
Debug.WriteLine( stopwatch.ElapsedMilliseconds );
return html;
}