Bonjour
J'ai besoin de faire une fonction qui fait des boucles donc j'utilise Rcpp.

On m'a toujours dit de passer les objets par references.
Or dans les tutoriels que j'ai vu, ils n'en parlent pas.

Je crée 2 fonctions simples:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// [[Rcpp::export]]
double meanC1(NumericVector &x) {
  int n = x.size();
  double total = 0;
 
  for(int i = 0; i < n; ++i) {
    total += x[i];
  }
  return total / n;
}
 
// [[Rcpp::export]]
double meanC2(NumericVector x) {
  int n = x.size();
  double total = 0;
 
  for(int i = 0; i < n; ++i) {
    total += x[i];
  }
  return total / n;
}

Et j’utilise
microbenchmark(meanC1(x), meanC2(x)) pour me fournir des statistiques sur la vitesse d’exécution:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Unit: milliseconds
      expr      min       lq     mean   median       uq      max neval cld
 meanC1(x) 176.4979 176.6425 178.0519 177.0741 178.8011 188.5153   100   b
 meanC2(x) 176.3904 176.5870 177.4585 176.8858 177.6912 185.0183   100  a
Surprise, la version avec une référence est globalement plus lente que sans références.

Est ce que quelqu'un serait e dire pourquoi?

Merci d'avance de votre aide.