C++中HTTP GET方法的速度

4
我一直在使用C++程序中的某些库来连接和获取不同的网站,主要使用了Chillkat和Curl。然而,最近我开始编写自己的HTTP获取器,使用了MSDN和Winsocket2库的帮助。
我编写了软件以打开一个SOCKET_STREAM类型的套接字并针对Ipv4建立连接,然后发送一个带有“Host:”和“Connection: close”标头的GET请求到服务器。一切似乎都很正常,但性能不如我所预期。捆绑的Chillkat库仍然比我的表现更好,尽管我已经尽可能地进行了优化。
我注意到,当我发送请求时,一些服务器需要更长的时间来响应。一旦它们做到了,它们会一次性发送所有内容。那么我该如何制定一个可以启动快速响应的标题请求呢?对于我的程序来说,速度非常重要。

我怀疑没有一个请求减速带的头文件,但您可以检查Chillkat发送的标题,以确保您没有错过任何内容。至于分块,这是正常现象;很多网站都这样做,所以您需要在自己的库中处理它。 - chrisaycock
检查更改套接字缓冲区是否会提高性能,也许你浪费了时间读取太小的数据块。有时候最好等待更大的数据块一次性传递,而不是多次读取小块。 - Kamil Klimek
1
单个个体编写的优化函数能够超过成千上万的开发人员组合,所有代码都经过审查和批判性地进行了优化的机率微乎其微,几乎为零。如果速度很重要,请使用一个广泛使用且以其速度闻名的已有库。 - Martin York
我有点通过经验意识到,我想使用Chillkat,因为我发现它非常优化,但是它不是开源的。而且cURL是用C语言编写的,而我正在使用C++,所以当我使用包装版本时,编译时出现了很多错误!我不是一个专业的C++程序员。 - Mohamad Elmasri
2个回答

1

如果您在现代低容量机器上看到性能差异,最可能的问题是您忘记关闭Nagle算法。使用setsockopt()将TCP_NODELAY设置为1。HTTP不是Telnet。

在看到性能问题并且有足够的数据量时,除了在单个写入调用中编写请求之外,不必担心显式刷新或缓冲区管理等任何内容。

对于下载速度,窗口大小会产生影响。您可以调整SO_SNDBUF和SO_RCVBUF。请注意,使您的基准测试快速的值可能会使您的实际性能变慢。


谢谢Janm,我关闭了Nagle算法,速度翻倍了,真的很有帮助。现在我的速度与Chillkat库相当,如果不是更快。 - Mohamad Elmasri

0
老实说,HTTP 是一个复杂的标准,有很多优化实现的方法。然而,你拥有足够的时间来优化它,并使其比 Chillkat 或 Curl 等已打包库更好的机会极小。如果你确实想要尝试,我建议你减少发送的头部数量,并在将状态行写入套接字后刷新套接字缓冲区(绕过 Nagle 算法)。这将使得正确编码的服务器稍微有点时间(几毫秒)来响应你的请求。但如果你的网络配置不是“理想的”,即使你这么做了,也可能会遇到麻烦。
最后要记住的是,当涉及到网络时,存在非常大的误差范围,在不同的服务器、网络甚至操作系统上使用不同的策略可能会得到不同的结果。

谢谢您的快速回复,我很想使用cURL,但是我不知道如何为C++,MVC++ 2010编译它。 - Mohamad Elmasri
cURL 不能没有 M$ 开发包。请查看下载页面(http://curl.haxx.se/download.html)。 - Chris Tonkinson

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