2017-03-01 5 views
0

240 MB 파일을 다운로드하기 위해 libcurl을 C++과 함께 사용하는 경우가 있는데, 그렇게하려면 15 분이 걸립니다. 내 글쓰기 콜백이 가능한 한 빨리 이루어 졌는지 확인했습니다. 그것은 단지 데이터를 충분히 많이 차지하는 인 메모리 버퍼에 쓰는 것입니다. curl 명령을 사용하여 동일한 서버에서이 동일한 파일을 다운로드하면 1 분 이내에 완료됩니다. 파일을 다운로드 할 때 브라우저를 사용하면 1 분도 채 걸리지 않습니다. 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); 

내 요청 설정에 문제가 있습니까? 필자가 쓰기 콜백을 변경하여 데이터를 작성한 더미 루틴으로 바꾼다면 가능한 한 빨리 버리십시오. 다운로드 속도는 여전히 매우 느립니다.

브라우저 목과 컬 명령이 적용되지 않는 상황에서 병목 목이 네트워크에서 보안 스캐닝 일 가능성이 있습니까?

+0

당신의 쓰기를위한 코드는 무엇입니까? 그 두 줄을 주석으로 처리하고 곱슬 곱슬하게 테스트를 위해 글을 쓰게한다면 더 빠릅니까? – drew010

답변

0

나는 더미 쓰기 기능으로 테스트했다고 주장했지만, 실제로는 그렇지 않았습니다. 더미 쓰기 기능으로 테스트했을 때, 다운로드 속도는 빨랐습니다.

그래서 필자의 쓰기 기능이 느리고 필자가 필요한 버퍼 크기로 초기화되지 않은 메모리 내 스트림 클래스를 사용하고 있다는 것을 알아 냈으므로 필요에 따라 커졌습니다. 버퍼의 성장은 아마도 작을 것이고 성장할 때마다 이전 버퍼의 전체 내용을 새로운 버퍼로 복사해야 할 필요가 있었을 것입니다 .... 그래서 짧게 이야기합니다 : 나는 바보입니다. 쓰기 스트림 천천히.

이제 파일 크기가 커지지 않도록 메모리 스트림을 전체 파일 크기로 초기화합니다. 아! 문제 해결됨.