HttpWebRequest的添加间隔时变慢(HttpWebRequest gets slower

2019-07-30 06:54发布

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

  • 普通的HttpWebRequest:169,360
  • Gzip已HttpWebRequest的:143,260
  • Web客户端GetStream:132,295
  • Web客户端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);
}

需要每个请求约610ms。

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

任何想法来解决这个问题?

Answer 1:

也许让这个尝试,尽管它可能只是帮助你的一个请求的情况下,实际上使事情变得更糟做多线程版本的时候。

ServicePointManager.UseNagleAlgorithm = false;

下面是从MSDN文档报价为HttpWebRequest类

这可能会对性能产生影响的另一种选择是使用UseNagleAlgorithm财产。 当此属性设置为true,TCP / IP将尝试使用TCP Nagle算法用于HTTP连接。 Nagle算法发送TCP数据包时汇总数据。 它积累小消息的序列成较大的TCP数据包在网络上发送数据之前。 使用Nagle算法可以优化网络资源的使用,尽管在某些情况下,性能也可能会降低。 通常为恒定,高体积吞吐量,性能改进是使用Nagle算法实现。 但对于较小吞吐量的应用,在性能下降可以看出。

应用程序通常不需要更改默认值被设置为true UseNagleAlgorithm财产。 但是,如果一个应用程序使用低延迟的连接,它可以帮助将此属性设置为false。



Answer 2:

我想你可能会泄漏资源,你不处置所有的每个方法调用的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;
  }


文章来源: HttpWebRequest gets slower when adding an Interval