On 6 January 2012 at 13:00, Steve Lianoglou wrote: | Hi, | | 2012/1/6 Douglas Bates <ba...@stat.wisc.edu>: | [snip] | > As I mentioned in another thread, I prefer the idiom | > | > int n2 = ::Rf_asInteger(n); | > | > because asInteger is part of the R API (in Rcpp it must be called as | > Rf_asInteger - the :: is a hint to the compiler that it will be found | > in the global namespace). Functions like asInteger and asReal are | > used in thousands of places in the base R code and have been optimized | > to death as well as being as general as they can possibly be. | | Cool ... I actually missed that tip, thanks for pointing it out again.
And if one overcomes the "ick" factor of mixing APIs <grin>, it saves a little: R> library(inline) R> library(microbenchmark) R> R> fr <- cxxfunction(signature(xs="integer"), plugin="Rcpp", body=' + int x = ::Rf_asInteger(xs); + return Rcpp::wrap(x); + ') R> R> frcpp <- cxxfunction(signature(xs="integer"), plugin="Rcpp", body=' + int x = Rcpp::as<int>(xs); + return Rcpp::wrap(x); + ') R> R> microbenchmark(fr(123), frcpp(123)) Unit: nanoseconds expr min lq median uq max 1 fr(123) 841 878.5 908.5 976 15684 2 frcpp(123) 976 999.5 1017.0 1085 6589 R> A good chunk here is "fixed" cost of calling a function, returning a value, ... so that the "variable" gain of ::Rf_asInteger() looks pretty good. Dirk, somewhat wondering why we're debating 100ns gains in the context of R -- "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too dark to read." -- Groucho Marx _______________________________________________ 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