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?
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] Indexing vector with x(i) and x[i] gives remarkable difference in computing time
2 messages · Søren Højsgaard, Romain Francois
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