Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2017, 15:05   #1
axsmak
 
Аватар для axsmak
 
Регистрация: 29.04.2017
Сообщений: 3
По умолчанию Как ускорить libcurl

Загружаю страницу с помощью curl двумя способами:
  • libcurl
  • system("curl")

Код первого способа:
Код:
/**
Коллбэк функция для curl
*/
size_t curlClbck( char *ptr, size_t size, size_t nmemb, std::string* data){
  if (data) {
    data->append(ptr, size*nmemb);
    return size*nmemb;
  }
  else return 0;
}

/**
 * Получает содержимое страницы по ссылке link
 * @param link Ссылка на страницу
 * @return Строка с содержимым страницы
 */
std::string curlGet(string link){
  std::cout << "Read to memory" << '\n';
  CURL *curl;
  std::string content;
  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, link.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlClbck);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
    CURLcode res = curl_easy_perform(curl);
    if (res == CURLE_OK) {
      curl_easy_cleanup(curl);
      return content;
    }else std::cerr << curl_easy_strerror(res) << std::endl;
    curl_easy_cleanup(curl);
  }
  return "";
}
Код второго способа:
Код:
  /**
   * Скачивает страницу по ссылке link в файл,
   * затем считывает файл в строку
   * @param link Ссылка на страницу
   * @return Строка с содержимым страницы
   */
  std::string systemGet (std::string link) {
    std::cout << "Read to file" << '\n';
    std::string res = "";
    std::string curl = "curl -o curl.html '" + link + "' -k > /dev/null 2>&1";
    system(curl.c_str());
    /*
      Здесь код считывания файла в строку res
      приводить его не буду, ибо он прост, но объёмен
    */
    return res;
  }
Тестируем функции:
Код:
  unsigned int start_time, end_time,work_time;
  
  start_time = clock();
  std::string tmp1 = gurlGet(link);
  end_time = clock();
  work_time = end_time - start_time;
  cout << "Libcurl time: " << work_time << '\n'; 
    
  start_time =  clock();
  std::string tmp2 = systemGet(link);
  end_time = clock();
  work_time = end_time - start_time;
  cout << "System  time: " << work_time << '\n'; 

  cout << "Length tmp1: " << std::to_string(tmp1.length()) << '\n';
  cout << "Length tmp2: " << std::to_string(tmp2.length()) << '\n';
Вывод:
Код:
Read to memory
Libcurl time: 20379
Read to file
System  time: 4646
Length tmp1: 114953
Length tmp2: 114953
Удивительно, но факт: скачать страницу в файл и считать из него в строку получается в 3 раза быстрее! Почему так медленно работает libcurl по сравнению с вызовом внешней программы? Как ускорить?
axsmak вне форума Ответить с цитированием
Старый 29.04.2017, 15:13   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

теперь поменяйте в "тесте" местами варианты
сначала с использованием файлов
потом libcurl
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 29.04.2017, 15:19   #3
axsmak
 
Аватар для axsmak
 
Регистрация: 29.04.2017
Сообщений: 3
По умолчанию

Да, пожалуйста

Read to file
System time: 4097
Read to memory
Libcurl time: 19515
Length tmp1: 114953
Length tmp2: 114953
axsmak вне форума Ответить с цитированием
Старый 29.04.2017, 15:22   #4
axsmak
 
Аватар для axsmak
 
Регистрация: 29.04.2017
Сообщений: 3
По умолчанию

Я сначала написал "ленивый вариант" с system и прогнал десяток страниц в цикле.
Потом, в надежде на ускорение, написал функцию на libcurl и тот же цикл отработал гораздо медленнее. Поэтому и начал проводить тесты и замеры
axsmak вне форума Ответить с цитированием
Старый 29.04.2017, 15:26   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А посмотрите исходник curl.exe.
Я думаю, что там не используют curl_easy_perform
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как ускорить AlexVI Общие вопросы C/C++ 10 15.07.2014 23:42
VB: как ускорить вывод в консоль? studen Помощь студентам 0 03.07.2014 21:07
Как ускорить программу ? juan666777 Общие вопросы Delphi 2 02.05.2009 19:48
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16