HttpWebRequest和WebClient哪个更快?

14

我需要获取特定URL的内容。这是一个简单明了的任务,但我希望它尽可能高效。

WebClient还是HttpWebRequest占用的内存更少? 哪个类完成相同的任务更快? 哪个类初始化时间更短?


1
"这取决于情况。为什么不试一下并找出答案呢?同时,使用难度和功能也有所不同。" - John Saunders
@JohnSaunders 这只是哪个更快的问题。老实说,我不知道如何准确地衡量我在问题中提到的内容。 - vfioox
3
如果你无法测量它,那么你就不需要知道它。 "更快" 没有简单的概念。最好的情况是 "在特定情况下更快"。基本上,不要过早地优化。 - John Saunders
1个回答

33

WebClient只是HttpWebRequest的一个包装器。使用WebClient可能会比直接使用HttpWebRequest稍微慢一点(几毫秒的量级)。但这种“低效率”带来了巨大的好处:它需要更少的代码,易于使用,并且在使用时更不容易出错。例如,考虑使用WebClient检索网页文本:

var client = new WebClient();
var text = client.DownloadString("http://example.com/page.html");

相比之下,与HttpWebRequest形成对比:

string text;
var request = (HttpWebRequest)WebRequest.Create("http://example.com/page.html");
using (var response = request.GetResponse())
{
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        text = reader.ReadToEnd();
    }
}

如果您想要下载并保存到文件,事情会变得非常有趣。对于 WebClient,只需调用 DownloadFile 即可简单完成。而对于 HttpWebRequest,您需要创建一个读取循环等。使用 HttpWebRequest 可能出错的方式数量真的令人惊讶。我知道这是因为我犯了很多错误。

现在考虑下载两个不同的页面。对于 WebClient,您可以编写:

var client = new WebClient();
var page1 = client.DownloadString(page1Url);
var page2 = client.DownloadString(page2Url);

完成了。如果使用HttpWebRequest,你需要复制上面的代码或将该代码封装在一个方法中。但如果你要将其封装在一个方法中,为什么不直接使用已经为你做了这些的WebClient呢?

考虑到对于快速网站的请求可能需要100到500毫秒左右,WebClient添加的少量毫秒开销最多只会占总时间的个位数百分比。

对于简单的事情,请使用WebClient。只有当你需要额外低级别控制时才使用HttpWebRequest。两者之间的速度考虑是无关紧要的。


1
我会说性能差异在微秒级别,而不是毫秒级别... 很好的回答! - Loudenvier
注意编码问题,WebClient 更易于使用,但是从这里 https://dev59.com/jmw05IYBdhLWcg3wnjAk 看来,你需要提前知道所使用的编码。 - Alkampfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接