[Rcpp-devel] Loops, iterators and accumulate
Hadley Wickham
h.wickham at gmail.com
Thu Nov 15 14:24:01 CET 2012
Hi all,
I'm trying to get a better handle on writing efficient numerical code
with C++. I've attached five implementations of a simple sum function
(mostly ignoring NAs) and timed them below:
> source("sum.r")
Unit: microseconds
expr min lq median uq max neval
sum(x) 11.67 11.72 11.76 11.82 20.6 100
sum1(x) 9.58 9.68 9.75 9.82 19.7 100
sum2(x) 37.44 37.55 37.59 37.63 48.1 100
sum2a(x) 9.59 9.66 9.73 9.81 14.0 100
sum3(x) 31.84 31.92 31.98 32.03 35.6 100
sum4(x) 9.60 9.69 9.77 9.86 30.5 100
* sum: R's built in sum
* sum1: loop
* sum2: iterator
* sum2a: iterator, but only compute x.end() once
* sum3: use accumulate
* sum4: use sugar sum
My questions:
* the R cpp introduction mentions that iterators are usually faster
than using [ directly, but I don't see that here (or in a number of
other places I've tried it). Why?
* The introduction vignette also uses iterators in a (as far as I can
tell) non-standard way - is that a mistake or some C++ magic I don't
understand? (I've used them in standard style in the attached code)
* why is accumulate so slow?
* I'm slightly surprised that sugar::sum is about 20% faster than R's
built-in sum. I would have expected base sum to be fairly well
optimised and close to the metal. I guess this may be because R's sum
deals with a few more cases of mixed arg types in ...
Hadley
--
RStudio / Rice University
http://had.co.nz/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sum.r
Type: application/octet-stream
Size: 1010 bytes
Desc: not available
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20121115/774aef6f/attachment.obj>
More information about the Rcpp-devel
mailing list