[Rcpp-devel] cost of .Call

Avraham Adler avraham.adler at gmail.com
Wed Aug 10 18:51:19 CEST 2022


Hi Konrad. 

As Dirk said, Rcpp makes life easy for the programmer by taking care of some of the background work automatically. So there may be a time vs. speed trade off against bespoke handwritten code. I have a comparison between a few implementations (base, C,Rcpp, Fortran) of a relatively simple function which may interest you [1]. 

Thanks,

Avi

[1] https://www.avrahamadler.com/2018/12/23/the-need-for-speed-part-2-c-vs-fortran-vs-c/

Sent from my iPhone

> On Aug 10, 2022, at 6:22 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
> 
> 
> Hi Konrad,
> 
> On 10 August 2022 at 08:22, konrad wrote:
> | I have a question regarding the cost of .Call. If I implement the 
> | rosenbrock function in R and in Rcpp. The R version is substentially 
> | faster then the C++ version. The Rcpp function is basically an R 
> | function which calls the C++ function using .Call. Which part of the 
> | code generates this overhead of the Rcpp function. Is it the .Call 
> | itself or the conversion of the types from R to Rcpp? Or have I done 
> | something wrong?
> 
> It's just a not a meaningful benchmark as there are essentially no operations
> on the R side either.
> 
> And Rcpp, by making it _convenient_ injects some extra code and tests and
> state keeping all of which is documented and for which you have some toggles
> to suppress at least parts.
> 
> But in short, it's a non-question. By all means keep exploring Rcpp but you
> will need something meatier for it to make sense. You should have no problem
> finding examples.
> 
> Cheers, Dirk
> 
> | 
> | library(Rcpp)
> | library(microbenchmark)
> | 
> | 
> | fr <- function(x) {   ## Rosenbrock Banana function
> |    x1 <- x[1]
> |    x2 <- x[2]
> |    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
> | }
> | 
> | sourceCpp(code = "
> | #include <Rcpp.h>
> | 
> | // [[Rcpp::export]]
> | double fr_rcpp(Rcpp::NumericVector x) {
> |    double x1 = x[0];
> |    double x2 = x[1];
> |    return 100 * (x2 - x1 * x1)*(x2 - x1 * x1) + (1 - x1)*(1 - x1);
> | }
> | ")
> | 
> | x <- c(1, 2)
> | identical(fr(x), fr_rcpp(x))
> | 
> | r <- microbenchmark(fr(x), fr_rcpp(x))
> | boxplot(r)
> | 
> | 
> | Thank you very much for your help!
> | 
> | 
> | All the best,
> | 
> | 
> | Konrad
> | _______________________________________________
> | 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.com | @eddelbuettel | edd at debian.org
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20220810/31ee94e1/attachment.html>


More information about the Rcpp-devel mailing list