Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 29.04.2017, 16:05   #1
axsmak
Новичок
 
Аватар для axsmak
 
Регистрация: 29.04.2017
Сообщений: 3
Репутация: 10
По умолчанию Как ускорить 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, 16:13   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,592
Репутация: 2091
По умолчанию

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как ускорить 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 15:40
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16


17:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru