为什么这个WebRequest代码很慢?

12 c# httpwebrequest httpwebresponse

我要求100页,所有404.我写了

    {
    var s = DateTime.Now;
    for(int i=0; i < 100;i++)
        DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
    var e = DateTime.Now;
    var d = e-s;
        d=d;
        Console.WriteLine(d);
    }

static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

    try
    {
        wreq = (HttpWebRequest)WebRequest.Create(url);
        wreq.KeepAlive = true;
        wreq.Method = "HEAD";
        wresp = (HttpWebResponse)wreq.GetResponse();
        ret = true;
    }
    catch (System.Net.WebException)
    {
    }
    finally
    {
        if (wresp != null)
            wresp.Close();
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

两次运行显示需要00:00:30.7968750和00:00:26.8750000.然后我尝试了Firefox并使用以下代码

<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
    document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

使用我的计算时间并计算它大约是4秒.4秒是6.5-7.5faster然后我的应用程序.我打算扫描成千上万的文件,因此花费3.75小时而不是30分钟将是一个大问题.如何让这段代码更快?我知道有人会说firefox缓存图像,但我想说1)它仍然需要检查远程服务器的标头,看看它是否已更新(这是我想要我的应用程序做)2)我不是收到正文,我的代码应该只是请求标题.那么,我该如何解决这个问题呢?

Max*_*Max 52

我注意到HttpWebRequest第一次请求时挂起了.我做了一些研究,似乎正在发生的是请求正在配置或自动检测代理.如果你设置

request.Proxy = null;
Run Code Online (Sandbox Code Playgroud)

在Web请求对象上,您可以避免初始延迟.

使用代理自动检测:

using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}
Run Code Online (Sandbox Code Playgroud)

没有代理自动检测:

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}
Run Code Online (Sandbox Code Playgroud)

  • 如果请求需要在某些客户端站点通过代理,会有什么后果?它还会知道需要获得代理吗? (2认同)

Art*_*ius 2

Firefox 可能会同时发出多个请求,而您的代码则一个接一个地执行这些请求。也许添加线程会加速你的程序。