[Rcpp-devel] Indexing vector with x(i) and x[i] gives remarkable difference in computing time

Romain Francois romain at r-enthusiasts.com
Thu Nov 27 13:34:03 CET 2014


> Le 27 nov. 2014 à 13:22, Søren Højsgaard <sorenh at 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 at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel



More information about the Rcpp-devel mailing list