Я использую libcurl для загрузки файлов по SFTP (протоколу), libcurl требуется примерно в два раза больше, чем при использовании исполняемого файла curl.
Это пример curl При разработке я следовал:
size_t my_fwrite(char* buffer, size_t size, size_t nmemb, File* file)
{
return size * nmemb; //Just return the size to prove that it's not the write
}
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
/** Setup URL/PORT/USERNAME/PASSWORD*/
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
CURLcode res = curl_easy_perform(curl);
if (CURLE_OK != res) {
// we failed
std::cout << "we failed due to '" << curl_easy_strerror(res) << "'\n";
}
// Close the file
curl_global_cleanup();
Во время работы я измерил время с помощью chrono stable_clock, и он использовал около 39 секунд для загрузки 119 МБ. Тогда как использование команды curl заняло 16 секунд. Я пробовал и с лагер-файлами, и применил то же самое. При загрузке 500 МБ libcurl использовал около 3 минут, а curl - 1,5 минуты. Бинарный файл curl и API компилируются с использованием CMake.
Команда curl была: curl -k sftp://username:password@host.com:port/path/to/file.zip --output file.zip
Обратите внимание, что я использовал скомпилированный curl, а не загруженный системой curl, как это было не поддерживает sftp
EDIT : скомпилирован как релиз. Запуск очень сонного профилировщика на исполняемом файле отладочной компиляции дал мне, что большая часть времени была потрачена на Curl_multi_wait
screeshot
Флаги CMAKE:
set(CMAKE_USE_LIBSSH2 ON)
set(CURL_ZLIB ON)
set(CMAKE_USE_OPENSSL ON)
set(BUILD_CURL_EXE ON)
set(CURL_STATICLIB ON)
EDIT2: Я скомпилировал свой код как на Ubuntu, так и на Windows (G CC 10.1.0 и VS 2019 16.6.3), и оба они страдают от той же проблемы, что использование Libcurl в два раза медленнее, чем используя бинарный файл Curl, который я компилирую.