libcurl下载速度太慢

时间:2017-03-01 16:55:01

标签: c++ performance curl download libcurl

我有一个案例,我使用libcurl和c ++下载240 MB文件,但这需要15分钟。我已经确保我的写回调尽可能快。它只是写入一个内存缓冲区,对于数据来说足够大。当我使用curl命令从同一台服务器下载同一文件时,只需不到一分钟。当我使用浏览器下载文件时,它也只需不到一分钟。我有可能错误地使用libcurl吗?这是我的代码片段......

wxString postFields;
postFields += "package_name=" + packageName;

if( desiredVersion != 0 )
        postFields += wxString::Format( "&package_version=v%d", desiredVersion );

curl_easy_reset( curlHandleEasy );

curl_slist_free_all( headers );
headers = nullptr;

headers = curl_slist_append( headers, "Content-Type: application/x-www-form-urlencoded" );
headers = curl_slist_append( headers, "Accept: application/x-zip-compressed" );

url = "http://" + packageServer + ":7000/package_download";
urlData = url.c_str();

binResponse = new BinaryResponse( packageSize );

curl_easy_setopt( curlHandleEasy, CURLOPT_HTTPHEADER, headers );
curl_easy_setopt( curlHandleEasy, CURLOPT_POSTFIELDS, postFieldsData );
curl_easy_setopt( curlHandleEasy, CURLOPT_URL, urlData );
curl_easy_setopt( curlHandleEasy, CURLOPT_WRITEFUNCTION, &Response::WriteCallback );
curl_easy_setopt( curlHandleEasy, CURLOPT_WRITEDATA, binResponse );

curlCode = curl_easy_perform( curlHandleEasy );

我的请求设置有问题吗?如果我将我的写回调改为一个虚拟例程,只是声称已经写入数据,但只是把它扔掉(尽可能快),我的下载速度仍然超级慢。

瓶颈是否可能是我正在遭受浏览器和卷曲命令的网络上的某种安全扫描?

1 个答案:

答案 0 :(得分:1)

我声称已经使用虚拟写入功能进行了测试,但实际上我没有。当我使用虚拟写入功能进行测试时,下载速度很快。

所以我调查了为什么我的写函数很慢并且发现我使用的内存流类没有用所需的缓冲区大小初始化,因此它根据需要增长。缓冲区的增长可能很小,每次增长时,都可能需要将旧缓冲区的全部内容复制到新缓冲区中......所以,长话短说:我很笨,而且写入流很慢。

现在我将内存流初始化为文件的总大小,以便它永远不会增长。啊!问题解决了。