On 6 January 2012 at 10:39, John Chambers wrote: | At the risk of derailing this thread into the quicksand of programming | style ....
Au contraire: thanks for joining in. | Except when required by the specific application, my preference would be | to stay with the Rcpp idiom. Mixing in the older C API seems to risk | more programming error. Of course, each application is different and we | have to make decisions about efficiency (machine) vs possible | inefficiency (human). Couldn't agree more. | The "Rf_" part of the API in particular is ugly and somewhat of an | add-on forced in a few examples by the use of some common names in the | macro files. | | This year in our Stanford grad course, I'm planning to push Rcpp, so in | a few months I may have a different view. :-) Let the bug reports roll in :) Dirk | Cheers, | John | | On 1/6/12 10:15 AM, Dirk Eddelbuettel wrote: | > 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