2017-03-01 225 views
0

我有一个情况,我正在使用libcurl与C++下载一个240 MB的文件,但它需要15分钟这样做。我确信我的写回调尽可能快。它只是写入一个足够大的数据的内存缓冲区。当我使用curl命令从同一台服务器下载同一个文件时,只需不到一分钟。当我使用浏览器下载文件时,它也需要不到一分钟的时间。是否有可能错误地使用libcurl?这是我的代码片段...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); 

我的请求设置有问题吗?如果我将写回调更改为只声称写入数据的虚拟例程,但只是将其抛出(尽可能快),我的下载速度仍然非常慢。

瓶颈是否可能是网络上的某种安全扫描,我受到浏览器和curl命令的影响?

+0

你的WRITEFUNCTION的代码是什么?如果您将这两行注释掉并让curl进行测试只是为了测试,它会更快吗? – drew010

回答

0

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

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

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