$30 off During Our Annual Pro Sale. View Details »

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.

Ronan Amicel

October 16, 2014
Tweet

More Decks by Ronan Amicel

Other Decks in Programming

Transcript

  1. Performance des
    frameworks web
    Ronan Amicel
    @amicel
    Meetup Paris.py — 16 octobre 2014
    Python vs The World

    View Slide

  2. Ronan Amicel
    Fondateur
    @ Pocket Sensei
    Hacker en résidence
    @ The Family

    View Slide

  3. Préambule

    View Slide

  4. Rapide != Meilleur

    View Slide

  5. Lies, damn lies, and…
    benchmarks

    View Slide

  6. Les données :

    benchmarks TechEmpower
    • http://www.techempower.com/benchmarks/
    • https://github.com/TechEmpower/
    FrameworkBenchmarks

    View Slide

  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

    View Slide

  8. Beaucoup de données
    93 6 3
    frameworks types de tests plateformes
    matérielles

    View Slide

  9. Méthodologie

    View Slide

  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

    View Slide

  11. 1) Texte brut
    • Réponse “Hello, World!”
    • Content-type: “text/plain”

    View Slide

  12. 2) Sérialisation JSON
    • Instancier un objet trivial (dictionnaire)
    • Sérialiser l’objet en JSON

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  17. 3 machines
    Serveur

    d’application
    Générateur

    de charge
    Base

    de données

    View Slide

  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

    View Slide

  19. Résultats

    View Slide

  20. Python vs Python

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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%

    View Slide

  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%

    View Slide

  27. Python vs The World

    View Slide

  28. Ruby

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  34. PHP

    View Slide

  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

    View Slide

  36. Node.js

    View Slide

  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

    View Slide

  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

    View Slide

  39. Java

    View Slide

  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

    View Slide

  41. Questions ?

    View Slide

  42. Merci !

    View Slide