Profiler un programme

Mesurer avant de changer quoi que ce soit : chronométrer un extrait, choisir entre profileur par instrumentation et par échantillonnage, lire temps propre et temps cumulé, un graphe en flammes, et éviter les mesures qui trompent.

  • 22 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Profilage : de quoi s'agit-il ?

    Voir la réponse

    Mesure, pendant une exécution réelle, du temps ou de la mémoire consommés par chaque partie d'un programme.

    L'intuition se trompe souvent sur ce qui coûte : on mesure d'abord, on décide ensuite. Sans mesure, on optimise une ligne qui pesait 1 % du temps.

  • Dans ce rapport cProfile, quelle fonction faut-il optimiser en premier ?

    ```text
    ncalls tottime percall cumtime percall filename:lineno(function)
    1 0.013 0.013 0.013 0.013 p.py:1(lent)
    1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
    1 0.000 0.000 0.013 0.013 p.py:7(main)
    50 0.000 0.000 0.000 0.000 p.py:6(rapide)
    1 0.000 0.000 0.013 0.013 {built-in method builtins.exec}
    1 0.000 0.000 0.013 0.013 p.py:1(<module>)
    `

    • lent
    • main
    • rapide
    • <module>
    Voir la réponse

    lent

    lent a le plus gros tottime : le temps est dépensé dans son propre corps. main et <module> ont le même cumtime, mais seulement parce qu'elles appellent lent. rapide est appelée 50 fois et coûte pourtant presque rien.

  • Pour chronométrer un extrait, on le répète plusieurs fois et on retient le … ou la médiane des temps, car le bruit de la machine ne fait que ralentir une mesure.

    Voir la réponse

    Pour chronométrer un extrait, on le répète plusieurs fois et on retient le minimum ou la médiane des temps, car le bruit de la machine ne fait que ralentir une mesure.

    La moyenne est tirée vers le haut par une exécution gênée par un autre processus. timeit.repeat rend la liste des temps de chaque série : on en retient le min.

  • Profileur : de quoi s'agit-il ?

    Voir la réponse

    Outil qui exécute un programme en observant combien de temps (ou de mémoire) chaque fonction consomme et combien de fois elle est appelée.

    Il existe deux familles : par instrumentation (chaque appel est enregistré, comme cProfile, précis mais plus lent) et par échantillonnage (on regarde la pile à intervalles réguliers, léger donc utilisable en production).

  • La première exécution d'une fonction met 900 ms, les suivantes 40 ms. Un collègue conclut que la fonction met 900 ms. Que lui répondre ?

    • Le 900 ms est la vraie valeur : les exécutions suivantes sont faussées par le cache et ne comptent pas
    • Il faut faire la moyenne des deux valeurs mesurées, soit environ 470 ms
    • Il faut recompiler tout le programme avant chacune des mesures effectuées
    • Démarrage à froid : on répète et on retient la médiane après échauffement
    Voir la réponse

    Démarrage à froid : on répète et on retient la médiane après échauffement

    La première exécution charge le code et les données et remplit les caches. Selon la question, on mesure le démarrage à froid ou le régime établi, mais jamais un mélange des deux.