测试下载网页源的各种可能性,我得到以下结果(到google.com,9gag.com的平均时间):
普通HttpWebRequest:169、360
Gzip HttpWebRequest:143、260
WebClient GetStream:132、295
WebClient下载字符串:143,389
因此,对于我的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;
}
有解决这个问题的想法吗?
最佳答案
也许可以尝试一下,尽管这样做可能只会帮助您解决单个请求的情况,并且在做多线程版本时实际上会使情况更糟。
ServicePointManager.UseNagleAlgorithm = false;
这是MSDN文档中对HttpWebRequest Class的引用
可能会影响性能的另一种选择是使用
UseNagleAlgorithm属性。当此属性设置为true时,
TCP / IP将尝试对HTTP连接使用TCP Nagle算法。
Nagle算法在发送TCP数据包时聚合数据。它
在将小消息序列累积到较大的TCP数据包之前
数据通过网络发送。使用Nagle算法可以
优化网络资源的使用,尽管在某些情况下
性能也会降低。通常用于恒定的高产量
吞吐量,使用Nagle实现了性能提升
算法。但是对于吞吐量较小的应用程序,
性能可以看到。
应用程序通常不需要更改默认值
UseNagleAlgorithm属性,该属性设置为true。但是,如果
应用程序正在使用低延迟连接,则可能有助于设置
属性为假。
关于c# - 添加间隔时HttpWebRequest变慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11362136/