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

2014-11-27 Thread Søren Højsgaard
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; in; ++i) z(i) = i;  // NOTICE: using ()
  return z;
}')
cppFunction('
IntegerVector insert2 (int n){
  IntegerVector z(n);
  for (int i=0; in; ++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 - 5
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?
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?

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


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

2014-11-27 Thread Romain Francois

 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; in; ++i) z(i) = i;  // NOTICE: using ()
  return z;
 }')
 cppFunction('
 IntegerVector insert2 (int n){
  IntegerVector z(n);
  for (int i=0; in; ++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 - 5
 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