[Rcpp-devel] Sugar seems slower than Rcpp.

Douglas Bates bates at stat.wisc.edu
Tue Jan 4 19:04:28 CET 2011


On Tue, Jan 4, 2011 at 11:13 AM, Romain Francois
<romain at 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")

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.ginestet05 at googlemail.com <mailto:c.ginestet05 at 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 at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>


More information about the Rcpp-devel mailing list