> Le 27 nov. 2014 à 13:22, Søren Højsgaard <sor...@math.aau.dk> a écrit :
> 
> Dear all,
> By "accident" I noticed that indexing with x(i) and x[i] gives remarkable 
> difference in computing time. For example:
> 
> library(Rcpp)
> cppFunction('
> IntegerVector insert1 (int n){
>  IntegerVector z(n);
>  for (int i=0; i<n; ++i) z(i) = i;  // NOTICE: using ()
>  return z;
> }')
> cppFunction('
> IntegerVector insert2 (int n){
>  IntegerVector z(n);
>  for (int i=0; i<n; ++i) z[i] = i;  // NOTICE: using []
>  return z;
> }')
> 
> Both functions "work":
> n <- 10; insert1(n); insert2(n)
> [1] 0 1 2 3 4 5 6 7 8 9
> [1] 0 1 2 3 4 5 6 7 8 9
> 
> But notice this difference in computing time:
> n <- 50000
> microbenchmark::microbenchmark( insert1(n), insert2(n) )
> Unit: microseconds
>       expr     min       lq     mean   median       uq      max neval cld
> insert1(n) 391.154 406.5500 416.9694 407.5005 421.1855  731.752   100   b
> insert2(n) 149.771 156.8045 189.9401 157.3745 163.0760 1204.635   100  a
> 
> So using z(i) is more than twice as slow as using z[i].
> 
> This prompts me to ask:
> 1) Why is that?

bounds checking. operator()(int i) checks that is i is between 0 and the length 
of the vector. 

> 2) In the vignettes it is always [i] that are used for vectors. But why is it 
> that (i,j) is then used for matrices. Wouldn't it be preferable if one could 
> use both [] and () for indexing in both cases (and with the same speed) - or 
> are there deeper reasons for this?

No such thing as a operator[](int, int) in C++ so we had to use ()

> 
> Best regards
> Søren
> 
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel@lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to