Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для axsmak
0 / 0 / 0
Регистрация: 29.04.2017
Сообщений: 2

Как ускорить libcurl

29.04.2017, 14:46. Показов 975. Ответов 4
Метки нет (Все метки)

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

Код первого способа:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
Коллбэк функция для 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 "";
}


Код второго способа:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /**
   * Скачивает страницу по ссылке link в файл,
   * затем считывает файл в строку
   * @param link Ссылка на страницу
   * @return Строка с содержимым страницы
   */
  std::string systemGet (std::string link) {
    std::cout << "Read to file" << '\n';
    std::string res = "";
    string curl = "curl -o curl.html '" + link + "' -k > /dev/null 2>&1";
    system(curl.c_str());
    /*
      Здесь код считывания файла в строку res
      приводить его не буду, ибо он прост, но объёмен
    */
    return res;
  }


Тестируем функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  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';
Вывод:
Code
1
2
3
4
5
6
Read to memory
Libcurl time: 20379
Read to file
System  time: 4646
Length tmp1: 114953
Length tmp2: 114953
Удивительно, но факт: скачать страницу в файл и считать из него в строку получается в 3 раза быстрее! Почему так медленно работает libcurl по сравнению с вызовом внешней программы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2017, 14:46
Ответы с готовыми решениями:

Как сделать ftp клиент через libcurl?
добрый день! подскажите, пожалуйста, как сделать ftp клиент через libcurl? а точнее, мне нужно видеть файлы, находящиеся на сервере. у...

Libcurl + QT Creator - Какую версию libcurl качать для Windows
Пытаюсь подружить Curl и QT Creator Подскажите пожалуйста какую версию libcurl качать для Windows и как вообще их подружить :) ...

Libcurl: как должен выглядеть callback?
Прежде, чем юзать libcurl.dll пробовал PyCurl, но тот почему-то все время валит Python. В итоге решил вызывать методы непосредственно из...

4
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
29.04.2017, 15:13
А теперь быстро, решительно man clock. Во втором случае время на скачивание вообще не учитывается.
0
 Аватар для axsmak
0 / 0 / 0
Регистрация: 29.04.2017
Сообщений: 2
29.04.2017, 15:17  [ТС]
Как же не учитывается, если в строке tmp2 скаченный результат уже есть до выполнения end_time = clock();
Я бы не заводил тему, если бы не заметил существенную разницу даже на глаз
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
29.04.2017, 20:36
Ещё раз: man clock
Цитата Сообщение от man clock
The clock() function returns an approximation of processor time used by the program.
Пока работает system() никакого processor time used by the program почти нет, программа висит на wait().
В общем методика расчета неверная.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
03.05.2017, 15:20
axsmak, ну тогда уж и про time стоит упомянуть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2017, 15:20
Помогаю со студенческими работами здесь

Как правильно подключить к проекту libcurl
http://curl.haxx.se/latest.cgi?curl=win32-devel-msv c вот это я как понял уже скомпилированные длл curllib.dll я кидал в system32 ...

Библиотека libcurl.dll или как отправить картинку на имеджхостинг
Доброго времени суток! &lt;?php /* http://localhost/upload.php: print_r($_POST); print_r($_FILES); */ $ch = curl_init(); ...

Как ускорить
Задача Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно...

Как ускорить программу?
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;functional&gt; #include &lt;limits&gt; #include &lt;numeric&gt; #include &lt;vector&gt; #include...

Как ускорить запись в БД?
Добрый всем день! Имеем: БД Sybase SQL Anywhere 5, Access2003. Подключаюсь через ODBC драйверы. В Sybase может быть открыта только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru