[Rcpp-devel] sugar performance
Douglas Bates
bates at stat.wisc.edu
Wed Dec 22 13:50:35 CET 2010
On Wed, Dec 22, 2010 at 5:33 AM, <romain at r-enthusiasts.com> wrote:
> Hello,
>
> Following Gabor's thread yesterday, I looked into R source code and figure that we don't need to test for NA when using numeric vector. See this:
>
> require(inline)
> require(Rcpp)
>
> pl <- cxxfunction( , '
> return List::create(
> NA_REAL + NA_REAL,
> NA_REAL + 1.0,
> 1.0 + NA_REAL
> );
> ', plugin = "Rcpp" )
> pl()
>
> As a consequence, I've updated plus.h to skip the tests when dealing with numeric sugar expressions.
Technically I think that you supposed to have code that assumes that
numeric NA's propagate inside a check for
#if IEEE_754
#endif
The number of systems running R that don't follow the IEEE floating
point standard is vanishingly small but either very old systems
(SPARC/Solaris, I believe, possibly AIX on some esoteric hardware) or
newer architectures (some versions of ARM, various graphics chips
using CUDA and similar systems) might not so it is best to test.
>
>
> Also, I'm trying to write the looping internally in order to get a better comparison. With the attached file, I get:
>
> romain@ /tmp $ Rscript gab.R
> Le chargement a nécessité le package : inline
> Le chargement a nécessité le package : methods
> Le chargement a nécessité le package : Rcpp
> Le chargement a nécessité le package : rbenchmark
> test replications elapsed relative user.self sys.self user.child sys.child
> 1 sugar 1 0.002 1.0 0.001 0 0 0
> 2 R 1 0.005 2.5 0.004 0 0 0
> test replications elapsed relative user.self sys.self user.child sys.child
> 1 sugar 1 0.035 1.0 0.034 0.000 0 0
> 2 R 1 0.049 1.4 0.049 0.001 0 0
> test replications elapsed relative user.self sys.self user.child sys.child
> 1 sugar 1 4.699 1.000000 3.701 0.999 0 0
> 2 R 1 5.324 1.133007 4.267 1.056 0 0
> test replications elapsed relative user.self sys.self user.child sys.child
> 2 R 1 45.995 1.000000 39.076 6.911 0 0
> 1 sugar 1 61.249 1.331645 46.178 15.067 0 0
>
>
> Another contributor to the time difference is the handling of garbage collection. Each time the constructor of an Rcpp class is called, a call to R_PreserveObject is issued. And each time the destructor is called, R_ReleaseObject is called. In this R-devel thread last year:
> http://thread.gmane.org/gmane.comp.lang.r.devel/23167 , some inefficiency of these functions were revealed, with a patch from Simon, but this has not been incorporated into R yet.
>
> Maybe we can send a reminder to sponsor the patch or use something else in Rcpp instead.
>
>
> The benchmark shows that sugar beats R first, and then R gets better as the size of the vectors grow. I think this is related to loop unrolling. it seems that it gives good performance for smaller lengths and not as good for bigger lengths.
>
>
> Romain
>
> _______________________________________________
> 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