On August 25, 2011 05:32:45 PM Dirk Eddelbuettel wrote: > Long story short I just committed a new self-contained example to the Rcpp > source which you can look at (and copy) via the URL [...] > The results bear this out. On my (standard i7, four cores hyperthreaded) > box: > > edd@max:~$ r ~/svn/rcpp/pkg/Rcpp/inst/examples/OpenMP/OpenMPandInline.r > Loading required package: methods > test replications elapsed relative user.self sys.self > 2 funOpenMP(z) 100 3.219 1.000000 25.26 0.07 > 3 funSerialRcpp(z) 100 9.030 2.805219 9.43 0.32 > 4 funSugarRcpp(z) 100 9.423 2.927307 9.06 0.35 > 1 funSerial(z) 100 9.601 2.982603 9.59 0.00 > edd@max:~$ > [...] > Rcpp sugar has no real leg up on manual loops, but is the shortest > implementation in two lines. Looping over an Rcpp vector is a little faster > than looping over a C++ STL vector (which incurs a copy).
I know you wanted to keep all code looking the same, but with std::transform all serial code is very short: serialStdAlgCode <- ' std::vector<double> x = Rcpp::as<std::vector< double > >(xs); std::transform(x.begin(), x.end(), x.begin(), ::log); return Rcpp::wrap(x); ' funSerialStdAlg <- cxxfunction(signature(xs="numeric"), body=serialStdAlgCode, plugin="Rcpp") serialStdAlgRcppCode <- ' Rcpp::NumericVector x = Rcpp::NumericVector(xs); std::transform(x.begin(), x.end(), x.begin(), ::log); return x; ' funSerialStdAlgRcpp <- cxxfunction(signature(xs="numeric"), body=serialStdAlgRcppCode, plugin="Rcpp") The results (without OpenMP because I'm currently on a single-core CPU): test replications elapsed relative user.self sys.self 3 funSerialStdAlgRcpp(z) 20 4.236 1.000000 3.792 0.252 4 funSerialRcpp(z) 20 4.312 1.017941 3.792 0.272 5 funSugarRcpp(z) 20 4.537 1.071058 3.744 0.588 2 funSerialStdAlg(z) 20 5.514 1.301700 4.329 0.884 1 funSerial(z) 20 5.536 1.306893 4.480 0.808 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