Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET HttpWebRequest速度与浏览器_C#_.net_Httpwebrequest_Performance - Fatal编程技术网

C# .NET HttpWebRequest速度与浏览器

C# .NET HttpWebRequest速度与浏览器,c#,.net,httpwebrequest,performance,C#,.net,Httpwebrequest,Performance,我有一个关于.Net HttpWebRequest客户端(或WebClient,给出类似结果)性能的问题 如果我使用HttpWebRequest请求一个html页面(在本例中为news.bbc.co.uk)并分析应用程序读取响应的速度(使用HttpAnalyzer),这比浏览器(Firefox、Chrome、IE)请求相同的资源(清除所有缓存等)要慢得多。Net应用程序大约需要1.7秒,而浏览器需要0.2-0.3秒 这纯粹是代码或应用程序的速度和效率,还是有其他因素需要考虑? 代码如下: Htt

我有一个关于.Net HttpWebRequest客户端(或WebClient,给出类似结果)性能的问题

如果我使用HttpWebRequest请求一个html页面(在本例中为news.bbc.co.uk)并分析应用程序读取响应的速度(使用HttpAnalyzer),这比浏览器(Firefox、Chrome、IE)请求相同的资源(清除所有缓存等)要慢得多。Net应用程序大约需要1.7秒,而浏览器需要0.2-0.3秒

这纯粹是代码或应用程序的速度和效率,还是有其他因素需要考虑? 代码如下:

HttpWebRequest request = null;

Uri uriTest = new Uri("http://news.bbc.co.uk");

request = (HttpWebRequest)WebRequest.Create(uriTest);

request.Method = "GET";
request.KeepAlive = true;
request.Headers["Accept-Encoding"] = "gzip, deflate";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

response.Close();

您是否在使用浏览器时观看了网络?也许浏览器正在使用缓存的资源?

我会在中间,运行浏览器请求和.NET请求一个接一个,并确保你真的得到了你的想法。有可能是重定向或其他一些可疑的事情(可能是浏览器在.NET等待重拨时预先附加了“/”,等等)无法立即看到。我在.NET HTTP客户端上构建了大量应用程序,但与您描述的完全不同——肯定还有其他事情在进行


如果将“/”粘贴在URL的末尾会发生什么情况?

可能是bbc.co.uk检查了传递给它的消息,并根据该消息处理响应。因此,如果它看到了自动客户端,那么它的响应速度会很慢,如果它认为有一个真实的人在队列的末尾,那么它就会加快速度。如果您真的想尝试一下,只需告诉HttpWebRequest传递一个不同的头

1.7秒的细分是什么?我怀疑你在测量整个过程

使用这段代码,我平均得到200毫秒:

var request = (HttpWebRequest)WebRequest.Create("http://www.bbc.co.uk/news/");

var stopwatch = new Stopwatch();
stopwatch.Start();

using (var response = (HttpWebResponse)request.GetResponse())
{
    stopwatch.Stop();
    Console.WriteLine("Elapsed: {0}ms", stopwatch.ElapsedMilliseconds);

    var responseStream = response.GetResponseStream();
    if (responseStream != null)
        using (var sr = new StreamReader(responseStream))
            Console.WriteLine("Title: {0}", Regex.Match(sr.ReadToEnd(), @"title>(.*)</title").Groups[1].Value);
}
var request=(HttpWebRequest)WebRequest.Create(“http://www.bbc.co.uk/news/");
var stopwatch=新秒表();
秒表。开始();
使用(var response=(HttpWebResponse)request.GetResponse())
{
秒表;
WriteLine(“经过:{0}毫秒”,秒表.elapsedmillesons);
var responseStream=response.GetResponseStream();
if(responseStream!=null)
使用(var sr=新的StreamReader(responseStream))

Console.WriteLine(“Title:{0}”、Regex.Match(sr.ReadToEnd(),@“Title>(.*)如果您发出两个请求,第二个请求是否会更快发生

我还注意到浏览器和WebClient或WebRequest之间的速度差异。即使是响应的原始速度也可能有很大的差异——但并非总是如此

这可能是由以下几方面造成的:

  • 可能是所有的.Net引导都会发生..Net程序集在使用之前不会被加载和JIT,因此,即使应用程序本身已经运行了很长时间,您也可以在对一段代码的初始调用中看到显著的速度下降。好吧,-.Net framework本身是nGen的,但仍然存在桥接在代码和.Net框架之间进行动态构建

  • 只需检查您是否在未连接调试程序的情况下运行,以及您是否确实没有打开symbol server-symbol server和VS会在下载符号时中断程序,从而降低存储桶的加载速度。如果这是一种侮辱,请道歉;)

  • 浏览器的编码仅能有效地利用少数底层套接字;浏览器一到,浏览器就会打开并启动。相比之下,我们使用.Net WebClient/WebRequest的“代码”完全没有效率,因为每次都会重新初始化

  • 有很多与网络相关的平台资源,虽然.Net使网络编码变得更加容易,但它仍然会遇到相同的平台资源问题。因此,离平台越近,一些代码的速度就越快。IE和Firefox等都是本地的,因此可以在系统资源中随意使用.Net不是,因此需要一些封送(=慢)来进行设置。显然,一旦打开并使用了端口,.Net仍然不是无精打采的;但它几乎永远不会像编写良好的非封送本机代码那样快


使用Ctrl+F5而不是F5(调试模式)运行应用程序。您将看到不同之处:

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            Stopwatch watch = Stopwatch.StartNew();
            var data = client.DownloadData("http://news.bbc.co.uk");
            watch.Start();
            Console.WriteLine("{0} ms", watch.ElapsedMilliseconds);
        }
    }
}

在我的电脑上打印880毫秒。

无论何时测量任何内容,都必须考虑启动成本。如果.net代码位于单个进程中,并且您仅测量单个请求,则初始化程序集、类型等的首次成本将影响您的测量

正如Darin和其他人所建议的,您应该确保:

1) 您没有在Debugger下运行进程。 2) 你要考虑启动成本


第二种方法是发出两个请求,只测量第二个请求。或者你可以发出N个请求,放弃第一个请求,并获得最后N-1个请求的平均值。还要确保读取实体流。

第一次请求页面时,.net尝试检测代理设置。解决方案是传入一个空的WebProxy对象通过这种方式,它只连接到远程服务器,而不是自动检测代理服务器

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriTest);
request.Proxy = new WebProxy();

对于同一个问题,马科斯的回答对我来说非常有效:

request.Proxy = new WebProxy();

将16秒的请求缩短到不到一秒。谢谢!

使用IP地址而不是URL,让我们看看DNS服务器是否是延迟的来源。对不起,我应该提到,您已经尝试过此操作(将上面的“”替换为“”)没有区别。我已经确认浏览器没有使用缓存资源。我看到了你问题的这一部分。我的意思是相反的-你确认了实际发生的情况吗?比较两种情况。另外,你只计算到响应。你应该得到
response.GetResponseStream()
阅读全文。+1,如果是gzip,Fiddler将向您显示传输的内容