添加Interval时,HttpWebRequest会变慢

时间:2012-07-06 12:23:09

标签: c# .net httpwebrequest gzip deflate

测试下载网页来源的不同可能性我得到了以下结果(google.com,9gag.com的平均时间毫秒):

  • Plain HttpWebRequest:169,360
  • Gzip HttpWebRequest:143, 260
  • WebClient GetStream: 132 ,295
  • WebClient DownloadString: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;
    }

有什么想法可以解决这个问题吗?

2 个答案:

答案 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;
  }