Cours 3 — Debug, Profile, Benchmark

Patrick Fournier

MAT8186 — Techniques avancées en programmation statistiques R

Automne 2023

Debug

Définitions

  • Processus de recherche et de correction des bugs 🪲
  • Tout le monde a déjà débogué 😁
  • Méthode “naïve”
    • À la main, avec print par exemple
    • Modification directe du code
  • Méthode interactive \( \Rightarrow \) utilisation d'un débogueur

Déboguage naïf

  • Méthode très employée
  • Utile pour courtes fonctions / bugs simples


Workflow
  1. Ajouter des print au code
  2. Exécuter le code augmenté
  3. Modifier le code
  4. Rincer et répéter
Exemple (trouvez l'erreur)

                    fact <- function(x) {
                        x < 0 && return(x)

                        x * fact(x - 1.0)
                    }
                

                    r$> fact(6)
                    [1] 0
                

Déboguage interactif

  • De base, R est livré avec un débogueur respectable
  • RStudio enrichit grandement l'expérience!


Workflow
  • Ajouter des breakpoints au code
  • Exécuter le code (interactivement)
  • Corriger le code

Profile

Définitions

  • Analyse d'un logiciel visant à mesurer sa complexité spatiale ou temporelle
  • Autres quantités d'intérêt
    • Utilisation d'une instruction précise
    • Fréquence des appels à des fonctions

Quand profiler?

  • Possibilité \( \not\Rightarrow \) nécessité
  • Devrait être la première étape de l'optimisation d'une logiciel
  • Un logiciel ne devrait être optimisé que lorsque nécessaire
  • Optimisation
    • Prend du temps ⏳
    • Rend le code plus difficile à comprendre 😵‍💫

Comment profiler

  • De base, R fournit Rprof
  • RStudio rend l'expérience beaucoup plus agréable

                    cutVector <- function(vec, m) {
                        n <- length(vec) / m
                        lapply(0:(m-1),
                               \(x) vec[seq(n * x + 1, n * (x + 1))])
                    }

                    dist0 <- function(m, n = 1e4) {
                        dat <- sample(0:9,
                                      size = n * m,
                                      replace = TRUE)
                        dat_chopped <- cutVector(dat, m)
                        sapply(dat_chopped, \(v) mean(v == 0))
                    }
                

                    r$> dist0(4, 24)
                    [1]0.166 0.125 0.0416 0.166
                

Benchmark

Définition

  • Comparaison de différents logiciels/approches/méthode
  • Peut être faite en fonction de différents critères
  • Vise à choisir un logiciel parmi un ensemble
  • Différent d'améliorer un logiciel
  • Exemple: étude de simulation

Comment benchmarker?

Méthode naïve: system.time
  • Très facile à mettre en place 🙂
  • Facile à interpréter 🙂
  • Une seule exécution 🙁
  • Analyse difficile 🙁
  • Moins précis que d'autre méthodes🙁
  • Pas d'analyse de la mémoire ni du garbage collector 🙁

Package bench

  • Fonction la plus importante: mark
  • Exécute un ensemble d'expressions un certain nombre de fois (voir options)
  • Fournit des statistiques sommaires sur l'exécution
  • Représentations graphiques: ggplot2::autoplot

Interprétation

  • Temps d'exécution \( \Rightarrow \) distribution asymétrique
  • Moyenne 🤨
  • Préférable d'utiliser le minimum ou la médiane