On Tue, Jan 4, 2011 at 12:04 PM, Douglas Bates <ba...@stat.wisc.edu> wrote: > On Tue, Jan 4, 2011 at 11:13 AM, Romain Francois > <rom...@r-enthusiasts.com> wrote: >> Le 04/01/11 17:42, Romain Francois a écrit : >>> >>> Le 04/01/11 16:35, Andrew Redd a écrit : >>>> >>>> Cedric, >>>> This was addressed about 2 weeks ago on the list, please read the >>>> archives. Basic point, Rcpp/sugar will not be faster than basic >>>> functions in R. Do something more complicated to see improvements. I >>>> would suggest something that involves lots of copies and edits, that >>>> will mess with R's memory management but be much more efficient in >>>> compiled code. >>>> >>>> -Andrew >>> >>> Hmmm. I suspect someone might be able to speed up "sum". Essentially it >>> contains lots of tests for NA that might be expensive if none of the >>> input data is NA. >>> >>> Not sure I want to be that someone just yet. >> >> Also, you might want to consider calculating xV.size() once (out of the >> loop) instead of xV.size() times. >> >> So for example: >> >> Summing2 <- cxxfunction(signature(x="numeric"), ' >> NumericVector xV(x); >> double out = 0.0; >> int n = xV.size() ; >> for(int i=0; i<n; i++) out += xV[i]; >> return wrap(out); >> ',plugin="Rcpp")
Actually I'm impressed that your version does as well as it does, Romain. I would have thought that using xV[i] would be slower than declaring double *xp = xV.begin(); and using xp[i] but it doesn't seem to be faster. Have you done something crafty to speed up xV[i]? > Another alternative is to use the std algorithms with Rcpp > > Summing3 <- cxxfunction(signature(x="numeric"), ' > NumericVector xV(x); > return wrap(std::accumulate(xV.begin(), xV.end(), double())); > ',plugin="Rcpp") > > > For me this gives > >> system.time(Summing1(x)); # Sugar > user system elapsed > 0.110 0.000 0.116 >> system.time(Summing2(x)); # Rcpp > user system elapsed > 0.040 0.000 0.041 >> system.time(Summing3(x)); # Rcpp + std::accumulate > user system elapsed > 0.04 0.00 0.04 >> system.time(sum(x)); # R-base > user system elapsed > 0.030 0.000 0.035 > > but I don't want to claim a great victory in saving 1/1000 th of a > second based on a sample of size 1. > >> For me this is faster than R: >> >>> n <- 10000000; x <- rnorm(n) >> >>> system.time(Summing1(x)); >> utilisateur système écoulé >> 0.040 0.000 0.039 >> >>> system.time(Summing2(x)); >> utilisateur système écoulé >> 0.011 0.000 0.011 >> >>> system.time(sum(x)); >> utilisateur système écoulé >> 0.017 0.000 0.017 >> Someone will deal with the sugar version later. >> >> Romain >> >>>> On Tue, Jan 4, 2011 at 8:14 AM, Cedric Ginestet >>>> <c.gineste...@googlemail.com <mailto:c.gineste...@googlemail.com>> wrote: >>>> >>>> Happy new year to everyone, >>>> >>>> I have made a very straightforward comparison of the performance of >>>> standard R, Rcpp function and sugar, and found that the latter >>>> produces the poorest performance. Let me know what you think and how >>>> I could improve such performance assessment. >>>> >>>> ################################################### >>>> Summing1 <- cxxfunction(signature(x="numeric"), ' >>>> NumericVector xV(x); >>>> double out = sum(xV); >>>> return wrap(out); >>>> ',plugin="Rcpp") >>>> Summing2 <- cxxfunction(signature(x="numeric"), ' >>>> NumericVector xV(x); >>>> double out = 0.0; >>>> for(int i=0; i<xV.size(); i++) out += xV[i]; >>>> return wrap(out); >>>> ',plugin="Rcpp") >>>> ################################################### >>>> # Results. >>>> n <- 1000000; x <- rnorm(n) >>>> Summing1(x); Summing2(x); sum(x) >>>> ####################### >>>> gives: >>>> [1] -396.6129 >>>> [1] -396.6129 >>>> [1] -396.6129 >>>> >>>> ################################################### >>>> # Time. >>>> system.time(Summing1(x)); # Sugar >>>> system.time(Summing2(x)); # Rcpp >>>> system.time(sum(x)); # R-base >>>> ################### >>>> > system.time(Summing1(x)); >>>> user system elapsed >>>> 0.016 0.000 0.016 >>>> > system.time(Summing2(x)); >>>> user system elapsed >>>> 0.008 0.000 0.011 >>>> > system.time(sum(x)); >>>> user system elapsed >>>> 0.000 0.000 0.003 >>>> >>>> >>>> Sugar appears to be the slowest! What about Rcpp basic loop? Why >>>> isn't as fast as the standard sum() in R-base? >>>> Cheers, >>>> Cedric >>>> >>>> -- >>>> Cedric Ginestet >>>> Centre for Neuroimaging Sciences (L3.04) >>>> NIHR Biomedical Research Centre >>>> Institute of Psychiatry, Box P089 >>>> Kings College London >>>> De Crespigny Park >>>> London >>>> SE5 8AF >>> >>> >> >> >> -- >> Romain Francois >> Professional R Enthusiast >> +33(0) 6 28 91 30 30 >> http://romainfrancois.blog.free.fr >> |- http://bit.ly/fT2rZM : highlight 0.2-5 >> |- http://bit.ly/gpCSpH : Evolution of Rcpp code size >> `- http://bit.ly/hovakS : RcppGSL initial release >> >> >> _______________________________________________ >> 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 >> > _______________________________________________ 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