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. Performance des frameworks web Ronan Amicel @amicel Meetup Paris.py —

    16 octobre 2014 Python vs The World
  2. Ronan Amicel Fondateur @ Pocket Sensei Hacker en résidence @

    The Family
  3. Préambule

  4. Rapide != Meilleur

  5. Lies, damn lies, and… benchmarks

  6. Les données :
 benchmarks TechEmpower • http://www.techempower.com/benchmarks/ • https://github.com/TechEmpower/ FrameworkBenchmarks

  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
  8. Beaucoup de données 93 6 3 frameworks types de tests

    plateformes matérielles
  9. Méthodologie

  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
  11. 1) Texte brut • Réponse “Hello, World!” • Content-type: “text/plain”

  12. 2) Sérialisation JSON • Instancier un objet trivial (dictionnaire) •

    Sérialiser l’objet en JSON
  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
  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
  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
  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
  17. 3 machines Serveur
 d’application Générateur
 de charge Base
 de données

  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
  19. Résultats

  20. Python vs Python

  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
  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
  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
  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
  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%
  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%
  27. Python vs The World

  28. Ruby

  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
  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
  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
  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
  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
  34. PHP

  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
  36. Node.js

  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
  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
  39. Java

  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
  41. Questions ?

  42. Merci !