Performance des frameworks web : Python vs The World

Performance des frameworks web : Python vs The World

Présentation au Meetup Paris.py le 16 octobre 2014.

B06b5d4777e2734feb91298062539ec8?s=128

Ronan Amicel

October 16, 2014
Tweet

Transcript

  1. 7.

    Historique • Round 1 : mars 2013 • Rounds 2

    et 3 : avril 2013 • Rounds 4 et 5 : mai 2013 • Round 6 : juillet 2013 • Round 7 : octobre 2013 • Round 8 : décembre 2013 • Round 9 : mai 2014
  2. 10.

    Les types de tests 1. Texte brut 2. Sérialisation JSON

    3. Requête simple 4. Requêtes multiples 5. Mise à jour de données 6. Fortunes
  3. 13.

    3) Requête simple • Utiliser l’ORM du framework pour récupérer

    une ligne au hasard dans une table de la base de données qui en contient 10 000 • Sérialiser le résultat en JSON
  4. 14.

    4) Requêtes multiples • Décoder un paramètre d’URL qui précise

    le nombre de lignes aléatoires à récupérer • Utiliser l’ORM du framework pour récupérer N lignes au hasard dans une table de la base de données qui en contient 10 000 • Sérialiser la liste de résultats en JSON
  5. 15.

    5) Mise à jour de données • Variation du test

    n°2 • Utiliser l’ORM pour récupérer une ligne au hasard dans une table qui en contient 10 000 • Modifier un des champs de l’objet • Utiliser l’ORM pour enregistrer l’objet modifié • Sérialiser l’objet modifié en JSON
  6. 16.

    6) Fortunes • Utiliser l’ORM du framework pour récupérer toutes

    les lignes d’une table de la base de données contenant un nombre arbitraire de messages (fortune cookies) • Insérer un nouveau message dans cette liste • Trier les messages par ordre alphabétique • Générer une page HTML de résultat avec le système de templating du framework
  7. 18.

    Les plateformes matérielles 1. EC2 • instances Amazon Web Services

    “m1.large” • réseau Ethernet Gigabit 2. i7 • stations de travail Intel Core i7-2600K (Sandy Bridge) avec 8 Go RAM • réseau Ethernet Gigabit 3. Peak • serveurs 2 x Xeon E5-2660 v2 (Ivy Bridge EP) avec 32 Go RAM • réseau Ethernet 10-gigabit
  8. 21.

    Frameworks Python Plateforme : Peak – Python 2 – Gunicorn

    Requêtes / seconde 0 20 000 40 000 60 000 80 000 100 000 Texte brut JSON 9 015 14 120 14 894 16 883 18 912 23 559 27 064 46 842 49 181 50 783 57 571 65 456 71 139 wsgi falcon bottle tornado flask pyramid django
  9. 22.

    Frameworks Python Plateforme : Peak – Python 2 – Gunicorn

    Requêtes / seconde 0 5 000 10 000 15 000 20 000 Requête simple 3 849 4 154 4 457 4 771 8 696 9 339 15 986 bottle-raw tornado flask-raw bottle pyramid django flask
  10. 23.

    Frameworks Python Plateforme : Peak – Python 2 – Gunicorn

    Requêtes / seconde 0 500 1 000 1 500 2 000 2 500 3 000 Requête multiples 400 405 419 512 707 2 200 2 561 bottle-raw flask-raw tornado django bottle flask pyramid
  11. 24.

    Frameworks Python Plateforme : Peak – Python 2 – Gunicorn

    Requêtes / seconde 0 1 500 3 000 4 500 6 000 7 500 9 000 Fortunes 2 009 3 035 3 315 3 475 5 840 8 740 bottle-raw flask-raw pyramid bottle flask django
  12. 25.

    Python 2 vs Python 3 Fortunes / Peak bottle flask

    pyramid django Requêtes / seconde 7 196 8 865 10 486 11 541 7 428 10 229 11 592 12 662 Python 2 Python 3 -8,9% -9,5% -13,3% -3,1%
  13. 26.

    Python 2 vs PyPy Fortunes / Peak / Gunicorn /

    MySQL flask-raw bottle flask Requêtes / seconde 6 598 8 694 9 400 11 592 12 662 22 936 Python 2 PyPy -59% -31% -43%
  14. 28.
  15. 29.

    Tests bas niveau
 WSGI vs Rack Peak Requêtes / seconde

    0 50 000 100 000 150 000 200 000 250 000 300 000 Texte Brut JSON 114 466 131 659 220 602 251 501 WSGI Rack
  16. 30.

    Microframeworks Peak Requêtes / seconde 0 50 000 100 000

    150 000 200 000 Texte brut JSON 23 092 30 541 114 466 131 659 60 065 66 463 159 153 172 662 220 602 251 501 WSGI Bottle Flask Rack Sinatra
  17. 31.

    Microframeworks + ORM Peak Requêtes / seconde 0 5 000

    10 000 15 000 20 000 Requête simple Requête multiples 79 1 003 1 111 15 158 1 196 19 329 Bottle Flask Sinatra
  18. 32.

    Frameworks “complets” Peak Requêtes / seconde 0 2 500 5

    000 7 500 10 000 12 500 15 000 Fortunes 2 729 7 428 10 229 11 592 12 662 bottle flask pyramid django rails
  19. 33.

    Django vs Rails Peak Requêtes / seconde 0 3 500

    7 000 10 500 14 000 JSON Requête simple Requête multiples Fortunes Mises à jour 279 2 729 580 4 032 6 091 818 7 428 1 801 10 685 12 082 Django Rails
  20. 34.

    PHP

  21. 35.

    Python vs PHP Fortunes / Peak php-raw yaf-raw phalcon-micro bottle-raw

    phalcon phpixie bottle flask pyramid django symfony2 Requêtes / seconde 0 25 000 50 000 75 000 100 000 8 023 10 229 11 592 12 662 33 283 544 13 050 16 720 42 754 58 015 97 508
  22. 36.
  23. 37.

    Python vs Node.js Plateforme : i7 / MongoDB Requêtes /

    seconde 0 20 000 40 000 60 000 80 000 100 000 Texte brut JSON Requête simple Requête multiples 3 325 25 729 69 563 73 401 707 9 339 23 559 27 064 Tornado Node.js
  24. 38.

    PyPy vs Node.js Plateforme : i7 / MongoDB Requêtes /

    seconde 0 25 000 50 000 75 000 100 000 Texte brut JSON Requête simple Requête multiples 1 473 25 774 84 517 94 068 3 325 25 729 69 563 73 401 707 9 339 23 559 27 064 Tornado Node.js Tornado + PyPy
  25. 39.
  26. 40.

    Python vs Java Fortunes / Peak gemini servlet-raw undertow grizzly-jersey

    bottle-raw wicket grails bottle flask pyramid spring django activeweb Requêtes / seconde 0 25 000 50 000 75 000 100 000 125 000 150 000 175 000 7 428 10 229 11 592 12 662 33 283 3 759 9 997 14 585 24 914 44 879 107 704 159 178 166 103
  27. 42.