Hi,

For one thing, the construct :

arma::mat B = Rcpp::as<  arma::mat>( A ) ;

probably makes copies along the way. I'm not sure what right now, but we might a different construct, something like:

arma::mat B ;
Rcpp::borrow<arma::mat>( B, A ) ;

where borrow would have this signature perhaps

template <typename T>
void borrow( T& target, SEXP origin ) ;


This would avoid some of these unnecessary copies. Not sure borrow is the right verb though.

Also, the compiler might implicitely inline dum1 and dum2 because they are so simple, so the performance might be the same, I'm not sure about that though ...

Romain



Le 11/08/10 21:30, baptiste auguie a écrit :
I think I understand the principle, however with my best effort I
cannot find a test case. Here I thought I'd be passing an arbitrarily
large arma matrix to some function, but again the timing is not
convincing (in fact, I had to stop the execution once with the dummy2
version),

using namespace Rcpp ;
using namespace RcppArmadillo ;

extern "C" {

   arma::mat dum1(arma::mat B)
   {
     return (B*38);
   }

   arma::mat dum2(const arma::mat&  B)
   {
     return (B*38);
   }

   RCPP_FUNCTION_2(NumericMatrix, dummy1, NumericMatrix A, int N) {
     arma::mat B = Rcpp::as<  arma::mat>( A ) ;
     return wrap(dum1(repmat(B, N, N)));
   }

   RCPP_FUNCTION_2(NumericMatrix, dummy2, NumericMatrix A, int N) {
     arma::mat B = Rcpp::as<  arma::mat>( A ) ;
     return wrap(dum2(repmat(B, N, N)));
   }

}

}

Regards,

baptiste


On 11 August 2010 19:21, Davor Cubranic<cubra...@stat.ubc.ca>  wrote:
On August 11, 2010 02:48:23 am rom...@r-enthusiasts.com wrote:
Le 10 août 2010 à 22:10, baptiste auguie
<baptiste.aug...@googlemail.com>  a écrit :
OK, thanks. I have not been able to produce a minimal code that
would exhibit an improved performance using this
passing-by-reference idea.

Hi,

It would usually make a difference when copying the object that is
passed by value is "expensive" to copy. Rcpp objects are very cheap
to copy and both copies refer to the same actual data (the same
SEXP).

For internal code my recommendation would be to always use pass by
reference and do an explicit call to clone when a real copy
(different SEXP) is needed.

In other words, if you were passing large arma::mat's, then const
references should make a real difference.

Davor

_______________________________________________
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



--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/aAyra4 : highlight 0.2-2
|- http://bit.ly/94EBKx : inline 0.3.6
`- http://bit.ly/aryfrk : useR! 2010

_______________________________________________
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

Reply via email to