I wrote you a full benchmark, используя тривиальное приложение Flask подкрепленной gUnicorn/meinheld + Nginx (для повышения производительности и HTTPS), и видя, сколько времени требуется для завершения 10000 запросов. Тесты выполняются в AWS на пару выгруженных экземпляров c4.large, а экземпляр сервера не ограничен ЦП.
TL; DR сводка: Если вы много работаете, используйте PyCurl, иначе используйте запросы. PyCurl заканчивает небольшие запросы 2x-3x так же быстро, как запросы, пока вы не достигли предела пропускной способности с большими запросами (около 520 Мбит или 65 МБ/с здесь) и использует от 3х до 10 раз меньше мощности ЦП. Эти цифры сравнивают случаи, когда поведение пула соединений одинаково; По умолчанию PyCurl использует пулы соединений и кеши DNS, где запросов нет, поэтому наивная реализация будет в 10 раз медленнее.
![CPU Time by request size detailed](https://i.stack.imgur.com/TD3ok.png)
![Just HTTP RPS](https://i.stack.imgur.com/1w1qd.png)
Обратите внимание, что двойные участки журнала используются только на графике ниже, из-за порядков, участвующих
![HTTP & HTTPS RPS](https://i.stack.imgur.com/bSKul.png)
- pycurl занимает около 73 CPU-микросекунд выдавать запрос при повторном использовании соединения
- запросы занимает около 526 CPU-микросекунд выдавать запрос при повторном использовании соединения
- pycurl занимает около 165 CPU-микросекунды открыть новое соединение и выдает запрос (без повторного подключения) или ~ 92 микросекунд, чтобы открыть
- запросов занимает около CPU-микросекунды открыть новое соединение и выдает запрос (без повторного подключения), или ~ 552 микросекунды для открытия
Full results are in the link, наряду с методологией сравнения и конфигурацией системы.
Предостережения: хотя я изо всех сил старалось обеспечить результаты собраны в научном пути, это только тестирование одного типа системы и одной операционной системы, а также ограниченное подмножество производительности и особенно вариантов HTTPS.
Ваш тест хорош, но localhost не имеет сетевого уровня. Если вы можете ограничить скорость передачи данных на фактических скоростях сети, используя реалистичные размеры ответов ('pong' нереалистичен) и включает в себя сочетание режимов кодирования контента (с сжатием и без сжатия) и * затем * создавать тайминги на основе что тогда у вас будут контрольные данные с фактическим значением. –
Я также отмечаю, что вы перенесли установку pycurl из цикла (установка URL-адреса и адреса writedata, возможно, должна быть частью цикла) и не считывать буфер 'cStringIO'; тесты non-pycurl все должны вызывать ответ как строковый объект Python. –
@MartijnPieters Недостаток сетевых издержек преднамерен; целью здесь является тестирование клиента изолированно. URL-адрес подключается туда, поэтому вы можете протестировать его на реальном реальном сервере по вашему выбору (по умолчанию это не так, потому что я не хочу забивать чью-то систему). ** Ключевое примечание: ** более поздний тест pycurl считывает тело ответа через body.getvalue, а производительность очень схожа. PRs приветствуются для кода, если вы можете предложить улучшения. – BobMcGee