测试不同的可能性,下载网页的源我得到的结果如下(以毫秒到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;
}
任何想法来解决这个问题?
也许让这个尝试,尽管它可能只是帮助你的一个请求的情况下,实际上使事情变得更糟做多线程版本的时候。
ServicePointManager.UseNagleAlgorithm = false;
下面是从MSDN文档报价为HttpWebRequest类
这可能会对性能产生影响的另一种选择是使用UseNagleAlgorithm财产。 当此属性设置为true,TCP / IP将尝试使用TCP Nagle算法用于HTTP连接。 Nagle算法发送TCP数据包时汇总数据。 它积累小消息的序列成较大的TCP数据包在网络上发送数据之前。 使用Nagle算法可以优化网络资源的使用,尽管在某些情况下,性能也可能会降低。 通常为恒定,高体积吞吐量,性能改进是使用Nagle算法实现。 但对于较小吞吐量的应用,在性能下降可以看出。
应用程序通常不需要更改默认值被设置为true UseNagleAlgorithm财产。 但是,如果一个应用程序使用低延迟的连接,它可以帮助将此属性设置为false。
我想你可能会泄漏资源,你不处置所有的每个方法调用的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;
}