Spe*_*kin 2 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 );
Run Code Online (Sandbox Code Playgroud)
我的请求设置有问题吗?如果我将写入回调更改为一个虚拟例程,仅声称已写入数据,但只是将其丢弃(尽可能快),我的下载速度仍然非常慢。
瓶颈是否有可能是网络上的某种安全扫描,而浏览器和curl命令却没有受到这种扫描的影响?
我声称已经使用虚拟写入功能进行了测试,但实际上没有。当我使用虚拟写入功能进行测试时,下载速度很快。
因此,我调查了为什么我的写入函数很慢,并发现我使用的内存中流类未使用所需的缓冲区大小进行初始化,因此它会根据需要增长。缓冲区的增长可能很小,每次增长时,它可能都需要将旧缓冲区的全部内容复制到新缓冲区中......所以,长话短说:我很笨,写入流很慢。
现在,我将内存流初始化为文件的总大小,这样它就不必增长。啊! 问题解决了。