I wrote you a full benchmark, utilizzando un'applicazione Flask banale sostenuta da gUnicorn/meinheld + nginx (per le prestazioni e HTTPS), e vedere quanto tempo ci vuole per completare 10.000 richieste. I test vengono eseguiti in AWS su una coppia di istanze c4.large non caricate e l'istanza del server non è stata limitata dalla CPU.
TL; Riepilogo DR: Se si sta facendo un sacco di networking, utilizzare PyCurl, altrimenti utilizzare le richieste. PyCurl termina le piccole richieste 2x-3x più velocemente delle richieste finché non raggiungi il limite di larghezza di banda con grandi richieste (circa 520 MBit o 65 MB/s qui) e utilizza da 3 a 10 volte meno potenza della CPU. Queste cifre confrontano i casi in cui il comportamento del pooling delle connessioni è lo stesso; per impostazione predefinita, PyCurl utilizza il pool di connessioni e le cache DNS, dove le richieste no, quindi un'implementazione ingenua sarà 10 volte più lenta.


Nota che trame doppie di registro vengono utilizzati solo per il grafico sottostante, a causa degli ordini di grandezza coinvolti

- pycurl dura circa 73 CPU-microsecondi ad emettere una richiesta quando si riutilizza una connessione
- richieste richiede circa 526 CPU-microsecondi di emettere una richiesta quando si riutilizza una connessione
- pycurl richiede circa 165 CPU-microsecondi un aperto nuova connessione e inviare una richiesta (nessuna connessione riutilizzo), o ~ 92 microsecondi per aprire
- richieste è di circa CPU-microsecondi ad aprire una nuova connessione e inviare una richiesta (nessuna connessione riutilizzo), o ~ 552 microsecondi da aprire
Full results are in the link, insieme alla metodologia di riferimento e alla configurazione del sistema.
Avvertenze: anche se ho preso la briga di garantire i risultati sono raccolti in modo scientifico, è solo testando un tipo di sistema e di un sistema operativo, e un sottoinsieme limitato di prestazioni e in particolare le opzioni HTTPS.
Il benchmark è piacevole, ma localhost non ha alcun overhead di livello di rete. Se si potesse limitare la velocità di trasferimento dei dati alle effettive velocità di rete, utilizzando dimensioni di risposta realistiche ('pong' non è realistico) e includendo un mix di modalità di codifica del contenuto (con e senza compressione), e * then * producono tempi basati su quello, quindi avresti dati di riferimento con significato reale. –
Nota anche che hai spostato il setup di pycurl fuori dal loop (impostando l'URL e writtedata target dovrebbe essere parte del loop), e non leggere il buffer 'cStringIO'; i test non pycurl devono tutti produrre la risposta come oggetto stringa Python. –
@MartijnPieters La mancanza di overhead di rete è intenzionale; l'intento qui è di testare il cliente da solo. L'URL è inseribile lì, quindi puoi testarlo su un server reale di tua scelta (di default non lo fa, perché non voglio martellare il sistema di qualcuno). ** Nota chiave: ** il test successivo di pycurl legge il corpo della risposta tramite body.getvalue e le prestazioni sono molto simili. I PR sono benvenuti per il codice se puoi suggerire miglioramenti. – BobMcGee