测试下载网页源的各种可能性,我得到以下结果(到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/

10-13 07:44