Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
29.04.2017, 15:09
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Загружаю страницу с помощью curl двумя способами: libcurl system("curl") Код первого способа: Код: sql 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. Код второго способа: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Тестируем функции: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вывод: Код: plaintext 1. 2. 3. 4. 5. Удивительно, но факт: скачать страницу в файл и считать из него в строку получается в 3 раза быстрее! Почему так медленно работает libcurl по сравнению с вызовом внешней программы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 15:44
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
В экспериментах надо учитывать эффект прогрева сети, проксей и состояния ОС. Я-бы предложил сделать явный запуск двух функций хотя-бы 5 или 7 раз чередуя их через чет-нечёт и усреднить время. Плюс я-бы заметил что загадочный закомментированный код где читается файл в строку может содержать ошибки которые приводят к замедлениям и было-бы весьма честно по отношению к форуму не прятать этот код а опубликовать. Иногда - дьявол в деталях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 16:00
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
14:09, axsmak Код: sql 1. 2. Дай угадаю: считывание идёт по одному символу?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 16:25
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
maytonВ экспериментах надо учитывать эффект прогрева сети, проксей и состояния ОС. Я-бы предложил сделать явный запуск двух функций хотя-бы 5 или 7 раз чередуя их через чет-нечёт и усреднить время. Я сначала написал "ленивый вариант" с system и прогнал десяток страниц в цикле. Потом, в надежде на ускорение, написал функцию на libcurl и тот же цикл отработал гораздо медленнее. Поэтому и начал проводить тесты и замеры. Тесты запускались не раз и в разных комбинациях. Результат один. maytonПлюс я-бы заметил что загадочный закомментированный код где читается файл в строку может содержать ошибки которые приводят к замедлениям. В том-то и подвох, что эта функция работает гораздо быстрее. Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 16:32
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Dimitry SibiryakovДай угадаю: считывание идёт по одному символу?.. Это коллбэк. Привязан тут: curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlClbck); ptr - указатель на принимаемые данные. size - размер принимамого блока данных nmemb - общее количество блоков данных, объем принимаемой информации определяется как size * nmemb То есть size определяет сам curl К тому же в предыдущем комментарии я показал код считывания из файла. Там точно по одному символу. Вполне справедливо для теста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 17:28
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
axsmak, еще есть вариант, что твое приложение линкует дебаг(неоптимизированную) версию курла, а исполняет релиз(оптимизированную) но 20с против 4с - это больше похоже на dns resolve или что то такое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 17:39
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Может дело в этом: Код: plaintext 1. clock() в линуксе меряет время работы процессора, т.е. запустив другой процесс через system() время останавливается. Попробуй заменить clock() на std::chrono Например так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 18:01
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
axsmak Код: sql 1. 2. 3. 4. 5. 6. 7. Тут может быть тормоз если curlClbck() многократно вызывается во время скачивания одного файла. Т.к. string::append() выделяет память под новую строку и делает копию каждый раз. Попробуй сразу зарезервировать сколько надо Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.04.2017, 18:08
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Для чистоты эксперимента лучше вообще замени добавление в строку на запись в файл. Тогда твой код будет делать тоже самое что и system("curl") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 00:16
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Функция curlGet() не монолитна. Она состоит из нескольких последовательно вызываемых методов libcurl каджый из которых потребляет своё время. Эти 20379 милисекунд распределены неоднородно по этим методам. Неплохо было-бы детализировать сколько сколько каждый занял. Далее получив картинку - подумаем почему много потребляет основной потребитель. Здесь могут быть варианты. Синхронность-асинхронность. Utf-0/ISO-8859-1. И не точная аналогия между system("curl....") и котом который использует curl_eazy. Почему мы решили что он эквивалентен? ХЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 07:06
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
maytonПочему мы решили что он эквивалентен? ХЗ. По эквивалентному результату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 10:27
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Самое верное замечание было дано Dima T - clock() замеряет процессорное время используемое моим приложением. Во время выполнения внешней программы curl моё приложение почти не использует процессорное время. С применением его lite_time_now() тесты показали примерно следующее время: libcurl - 700 мск system - 550 мск Затем я изменил тест, прогоняя 10 разных страниц в цикле. И прогонял цикл несколько раз c разрывом в пару секунд. Так вот, цикл с system всегда показывает 5400-6000 мск, а libcurl в первый цикл показывает 7500-8000 мск, а последуюющие 5000-5200 мск. Стоит подождать некоторое время и libcurl опять остывает. Кстати, до тестов я сделал резервирование памяти под строку результата content.reserve(1000000); Потом убрал её и скорость незначительно, но возрасла. Теперь libcurl, после разогрева показывает 4800-5000 мск, что, наконец-то превосходит system Теперь осталось разобраться почему libcurl тормозит во время первого запуска. Какие мысли будут, господа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 10:38
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
axsmakТеперь осталось разобраться почему libcurl тормозит во время первого запуска. Какие мысли будут, господа? К DNS обращается при первом вызове. При последующих к локальному кэшу. Поставь первым вызов system(), будет на нем тормозить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 10:43
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Логи тестов libcurl первый запуск Код: plaintext 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. libcurl следующий запуск Код: plaintext 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. system любой запуск Код: plaintext 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 10:47
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Dima TК DNS обращается при первом вызове. Реально ли программно реализовать что-то вроде кэша dns или просто забить на это? Просто напрягает, что тормозит весь цикл, а не, хотя бы, первый вызов функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 10:51
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Dima T, Совершенно верно авторCURLOPT_DNS_CACHE_TIMEOUT - set life-time for DNS cache entries By default, libcurl caches this info for 60 seconds. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 11:46
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
Всё нашёл. Код: plaintext 1. Жёстко прописал айпи сервера в настройки курл. Кроме того вынес инициализацию из функции и вызываю в начале работы. Определил неймспейс для работы с курлом, где написал функции инициализации, закрытия и выполнения запроса. Скорость возросла в полтора раза в сравнении с system Всем спасибо, код прилагаю Буст libcurl Код: plaintext 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 14:22
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
axsmak, почему не сделать CURL *curl = nullptr; ? иначе довольно опасно. значение переменно не определено, но производится проверка. если там будет "мусор" проверка может пройти, но работать не будет(в лучшем случае). Ну и не понимаю я таких проверка на nullptr как if(curl){ почему не сделать явное условие? видимо, -Wall -Werror не используются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 15:27
|
|||
|---|---|---|---|
|
|||
Как ускорить libcurl? |
|||
|
#18+
alex_kНу и не понимаю я таких проверка на nullptr как if(curl){ почему не сделать явное условие? видимо, -Wall -Werror не используются Это идиома с/с++. С чего вдруг должны быть предупреждения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 16:28
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
axsmakЖёстко прописал айпи сервера в настройки курл. IP поменяется и долго будешь искать почему работать перестало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 16:42
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Anatoly Moskovskyalex_kНу и не понимаю я таких проверка на nullptr как if(curl){ почему не сделать явное условие? видимо, -Wall -Werror не используются Это идиома с/с++. С чего вдруг должны быть предупреждения? да, нет варнинга. а я бы сделал! :) чтобы в условиях был только буль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 16:53
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
alex_kAnatoly Moskovskyпропущено... Это идиома с/с++. С чего вдруг должны быть предупреждения? да, нет варнинга. а я бы сделал! :) чтобы в условиях был только буль 0, NULL и false это одно и тоже. Это просто надо знать если пишешь на С/С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 17:30
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Dima Talex_kпропущено... да, нет варнинга. а я бы сделал! :) чтобы в условиях был только буль 0, NULL и false это одно и тоже. Это просто надо знать если пишешь на С/С++. при это NULL - это просто символьное имя, которое может быть чем угодно :) Это тоже надо знать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.04.2017, 17:38
|
|||
|---|---|---|---|
Как ускорить libcurl? |
|||
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2018184]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
188ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 282ms |
| total: | 569ms |

| 0 / 0 |
