[Rcpp-devel] use of auxiliary functions

baptiste auguie baptiste.auguie at googlemail.com
Sat Aug 14 19:18:58 CEST 2010


Thanks for the conclusive example :)

baptiste



On 12 August 2010 21:53, Dirk Eddelbuettel <edd at debian.org> wrote:
>
> On 12 August 2010 at 20:59, baptiste auguie wrote:
> | Point well taken, l'll try to use const and const& wherever appropriate.
>
> I am coming to this late (sorry, too much other stuff going on...) but I had
> meant to illustrate the good advise provided by Davor and Romain.  So here is
> a stylized Armadillo examples -- not involving SEXPs as these really are
> pointers which muddles everything.   So here I simply create a matrix and
> ship it to two functions: one uses const ref , one uses copy:
>
>   edd at max:~/src/progs/C++$ ./const_ref_vs_copy_cost
>   t0: 2010-Aug-12 14:45:04.526660
>   t1: 2010-Aug-12 14:45:04.526731 00:00:00.000071
>   t2: 2010-Aug-12 14:45:05.054273 00:00:00.527542
>
> So 71 microsecs versus 527 millisecs.  This uses Boost which gives us nice
> granularity of time on Linux.  On another OS your mileage may vary. The Emacs
> compile-command "works for me" with Boost and Armadillo in standard
> places. Adjust as necessary.
>
> And for what it is worth, "const whenever possible" is item #3 in "Effective
> C++" by Meyers, a book Romain and I both cherish.
>
> Cheers, Dirk
>
>
> // -*- compile-command: "g++ -s -O3 -Wall -pedantic -pipe -o const_ref_vs_copy_cost const_ref_vs_copy_cost.cpp -lboost_date_time-mt" -*-
>
> #include <boost/date_time/posix_time/posix_time.hpp>
> #include <armadillo>
> #include <iostream>
>
> using namespace boost::posix_time;              // boost timers
> using namespace boost::gregorian;
>
> using namespace arma;
>
> double doSomeMindlessWork_const_ref(const mat & m) {
>  int n = m.n_rows;
>  int k = m.n_cols;
>
>  return m(0,0) + m(n-1, k-1);
> }
>
> double doSomeMindlessWork_copy(mat m) {
>  int n = m.n_rows;
>  int k = m.n_cols;
>
>  return m(0,0) + m(n-1, k-1);
> }
>
>
> int main() {
>  const int n = 10000;
>
>  mat m = mat(n, n);
>
>  ptime t0 = microsec_clock::local_time();
>  doSomeMindlessWork_const_ref(m);
>  ptime t1 = microsec_clock::local_time();
>  doSomeMindlessWork_copy(m);
>  ptime t2 = microsec_clock::local_time();
>
>  std::cout << "t0: " << to_simple_string(t0) << "\n"
>            << "t1: " << to_simple_string(t1) << " " << to_simple_string(t1-t0) << "\n"
>            << "t2: " << to_simple_string(t2) << " " << to_simple_string(t2-t1) << "\n"
>            << std::endl;
>
>  return 0;
> }
>
> --
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>



-- 
____________________

Dr. Baptiste Auguié

Departamento de Química Física,
Universidade de Vigo,
Campus Universitario, 36310, Vigo, Spain

tel: +34 9868 18617
http://webs.uvigo.es/coloides
____________________


More information about the Rcpp-devel mailing list