[Rcpp-devel] Rcpp speed
Dirk Eddelbuettel
edd at debian.org
Tue Dec 21 15:39:39 CET 2010
On 21 December 2010 at 09:15, Gabor Grothendieck wrote:
| Can anyone explain these results? Rcpp takes 30% more time than R
| with 10 elements, the same time as R with 1000 elements and 7x as long
| with a million elements. I would have expected the ratio to be
| highest for `10 elements since that would be dominated by the call
| sequence but its the other way around and it seems to get relatively
| less efficient as the size of the vector grows.
Errr, these are _single expressions in the R parser_ ! So how could they be
faster in Rcpp when we have to do the extra marshalling of objects on the
heap, NA tests, exception handlings, etc pp ? Did you seriously thing there
could be a gain?
If you have a real task, time that.
Do you recall the issue started by Radford Neal about curly or straight
paranthese? When Christian Robert followed up and that whole thing became a
little blogging storm, I wrote an ad-hoc post ... demonstrating an 80-fold
speed increase with Rcpp. That was in September, and be we may well have got
faster since as a number of tweaks went into Rcpp.
In any event, the aforementioned blog post is
http://dirk.eddelbuettel.com/blog/2010/09/07#straight_curly_or_compiled
Otherwise, thanks for being empirical and posting replicable code using
inline and rbenchmark. That is the right idea. But I fear you started to
measure the wrong question here.
Cheers, Dirk
|
| > require(inline)
| > testfun <- cxxfunction(signature(x="numeric", y="numeric"),
| + body = '
| + NumericVector xx(x);
| + NumericVector yy(y);
| + NumericVector zz = xx + yy;
| + return( zz );
| + ', plugin="Rcpp")
| > x <- 1:3
| > y <- 10 * x
| > testfun(x, y)
| [1] 11 22 33
| >
| > library(rbenchmark)
| > x <- 1:10
| > benchmark(replications = 10000, R = x + x, Rcpp = testfun(x, x))
| test replications elapsed relative user.self sys.self user.child sys.child
| 1 R 10000 0.17 1.000000 0.16 0 NA NA
| 2 Rcpp 10000 0.22 1.294118 0.23 0 NA NA
| >
| > x <- 1:1000
| > benchmark(R = x + x, Rcpp = testfun(x, x))
| test replications elapsed relative user.self sys.self user.child sys.child
| 1 R 100 0.00 0 0.00 0 NA NA
| 2 Rcpp 100 0.01 1 0.01 0 NA NA
| >
| > x <- 1:1000000
| > benchmark(R = x + x, Rcpp = testfun(x, x))
| test replications elapsed relative user.self sys.self user.child sys.child
| 1 R 100 2.34 1.000000 1.81 0.15 NA NA
| 2 Rcpp 100 16.64 7.111111 12.63 1.66 NA NA
|
|
| --
| Statistics & Software Consulting
| GKX Group, GKX Associates Inc.
| tel: 1-877-GKX-GROUP
| email: ggrothendieck at gmail.com
| _______________________________________________
| 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
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the Rcpp-devel
mailing list