Chapitre 3 Mesurer et comparer des temps d’exécution

La première étape avant d’optimiser un code est de pouvoir mesurer son temps d’exécution, afin de pouvoir comparer les temps d’exécution entre différente implémentations.

3.1 Mesurer des temps d’exécution avec system.time()

Pour mesure le temps d’exécution d’une commande R, on peut utiliser la fonction system.time() comme ceci :

##    user  system elapsed 
##   0.001   0.000   0.001

Le problème qui apparaît sur cet exemple est que l’exécution est tellement rapide que system.time() affiche 0 (ou une valeur très proche). De plus, on voit qu’il y a une certaine variabilité quand on relance plusieurs fois la commande.

Ainsi si on souhaite comparer notre code avec la fonction mvtnorm::dmvnorm(), on ne peut pas utiliser system.time() :

##    user  system elapsed 
##   0.004   0.000   0.004

On pourrait se dire qu’il faut augmenter la complexité de notre calcul, mais il y a mieux : utiliser le package microbenchmark !

3.2 Comparer des temps d’exécution avec microbenchmark()

Comme son nom l’indique, ce package permet justement de comparer des temps d’exécution même quand ceux-ci sont très faibles. De plus, la fonction microbenchmark() va répéter un certain nombre de fois l’exécution des commandes et donc va stabiliser le résultat.

## Unit: microseconds
##                                           expr    min      lq     mean
##                 mvtnorm::dmvnorm(rep(1.96, 2)) 41.899 50.3690 65.20473
##  mvnpdf(x = matrix(rep(1.96, 2)), Log = FALSE) 33.479 40.4305 50.17212
##   median      uq      max neval
##  58.6825 67.7505 1822.501  1000
##  46.2140 53.9490  207.524  1000

Les deux fonctions mvnpdf() et dmnvorm() étant capables de prendre en entrée une matrice, on peut également comparer leurs comportements dans ce cas :

## Unit: microseconds
##                                                       expr     min
##         mvtnorm::dmvnorm(matrix(1.96, nrow = n, ncol = 2))  62.328
##  mvnpdf(x = matrix(1.96, nrow = 2, ncol = n), Log = FALSE) 456.611
##        lq      mean  median       uq      max neval
##   71.5295  88.33074  77.482 101.4010  193.868   100
##  516.9945 593.73818 554.145 697.3815 1014.220   100

Il s’est passé un quelque chose… Et on va diagnostiquer ce problème dans la suite.