2017-03-01 229 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

我聲稱已經用虛擬寫入功能進行了測試,但實際上並沒有。當我使用虛擬寫入功能測試時,下載速度很快。

所以我調查了爲什麼我的寫入功能很慢,發現我使用的內存流類沒有使用所需的緩衝區大小進行初始化,因此它正在根據需要增長。緩衝區的增長可能很小,每當它增長時,它可能需要將舊緩衝區的全部內容複製到新緩衝區中。所以,長話短說:我很笨,而寫入流很慢。

現在我初始化我的記憶流到文件的總大小,以便它永遠不會增長。啊!問題解決了。