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

WRITEFUNCTIONのコードは何ですか?あなたがそれらの2行をコメントアウトして、curlにテスト用の書き込みだけをさせるのが速いのですか? – drew010

答えて

0

私はダミーの書き込み機能でテストしたと主張していましたが、実際にはそうではありませんでした。ダミーの書き込み機能でテストしたところ、ダウンロード速度は速かったです。

なぜ私の書き込み機能が遅く、必要なバッファサイズで初期化されていないメモリ内ストリームクラスを使用していることがわかったので、必要に応じて成長していました。バッファーの成長はおそらく小さく、成長するたびに古いバッファーの内容全体を新しいバッファーにコピーする必要があったと思います....だから、長いストーリー短く:私は愚かであり、書き込みストリーム遅かったです。

今では、メモリストリームをファイルの合計サイズに初期化して、ファイルサイズが大きくならないようにします。うん!問題が解決しました。

関連する問題