HttpWebRequest se ralentiza al agregar un intervalo

Probando diferentes posibilidades para descargar la fuente de una página web, obtuve los siguientes resultados (Tiempo promedio en ms para google.com, 9gag.com):

  • Http simple WebWebRequest: 169, 360
  • Gzip HttpWebRequest: 143, 260
  • Cliente Web GetStream: 132 , 295
  • WebClient DownloadString: 143, 389

Así que para mi cliente de 9gag decidí tomar el gzip HttpWebRequest. El problema es que, después de implementar en mi progtwig actual, la solicitud lleva más del doble del tiempo.
El problema también se produce cuando se agrega un Thread.Sleep entre dos solicitudes.

EDITAR:
Solo mejoré un poco el código, aún el mismo problema: cuando se ejecuta en un bucle, las solicitudes toman más tiempo cuando agrego un Retardo entre las solicitudes

for(int i = 0; i < 100; i++) { getWebsite("http://9gag.com/"); } 

Tarda unos 250ms por pedido.

 for(int i = 0; i < 100; i++) { getWebsite("http://9gag.com/"); Thread.Sleep(1000); } 

Toma alrededor de 610ms por pedido.

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

¿Alguna idea para solucionar este problema?

Tal vez intente esto, aunque solo puede ayudar a su caso de una sola solicitud y en realidad empeorar las cosas al hacer una versión de multiproceso.

 ServicePointManager.UseNagleAlgorithm = false; 

Aquí hay una cita de los documentos de MSDN para la clase HttpWebRequest

Otra opción que puede tener un impacto en el rendimiento es el uso de la propiedad UseNagleAlgorithm. Cuando esta propiedad se establece en true, TCP / IP intentará usar el algoritmo TCP Nagle para las conexiones HTTP. El algoritmo de Nagle agrega datos al enviar paquetes TCP. Acumula secuencias de pequeños mensajes en paquetes TCP más grandes antes de que los datos se envíen a través de la red. El uso del algoritmo de Nagle puede optimizar el uso de los recursos de la red, aunque en algunas situaciones también se puede degradar el rendimiento. Generalmente, para un rendimiento de alto volumen constante, se realiza una mejora del rendimiento utilizando el algoritmo de Nagle. Pero para aplicaciones de rendimiento más pequeño, puede verse una degradación en el rendimiento.

Normalmente, una aplicación no necesita cambiar el valor predeterminado para la propiedad UseNagleAlgorithm que se establece en verdadero. Sin embargo, si una aplicación usa conexiones de baja latencia, puede ayudar a establecer esta propiedad en falso.

Creo que podría estar perdiendo recursos ya que no está eliminando todo su objeto IDisponible con cada llamada de método.

Dale esta versión e intenta ver si te da un tiempo de ejecución más consistente.

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