[Rcpp-devel] Rcpp ISNAN slower than C ISNAN?
Johannes Kruisselbrink
johannes at kruisselbrink.eu
Wed Dec 14 07:26:39 CET 2016
Moving the call outside the main loop would be effective for some
scenarios (i.e, the scenarios where the data objects do not contain
NaNs). However, once they do we still want to compute a distance based
on the values and "correct" for the NaNs in some way, so skipping the
entire object is not really an option. Including a switch between the
cases of objects with and objects without NaNs is probably something
worthwhile (that and using more rcpp-sugar).
Nevertheless, the question still remains why the rcpp isNaN call is so
much slower.
On 12/13/2016 2:04 PM, xian at unm.edu (Christian Gunning) wrote:
>> | for (i = 0; i < numObjects; i++) {
>> | for (j = 0; j < numCodes; j++) {
>> | dist = 0;
>> | for (k = 0; k < numVars; k++) {
>> | if (!ISNAN(data[i * numVars + k])) {
>> | tmp = data[i * numVars + k] - codes[j * numVars + k];
>>
>> Why not drop data and codes and use sData1(i,k) - sData2(j,k) ?
> Or better yet, just use the original code with NumericMatrix:
> sData1[i * numVars + k] does the right thing.
> I don't get any timing difference based on this change.
>
> Using Rcpp sugar
> (https://cran.r-project.org/package=Rcpp/vignettes/Rcpp-sugar.pdf),
> and moving the call outside the loop, appears to do the right thing.
>
> ## modified example
> ## see edits here:
> https://github.com/helmingstay/rcpp-timings/blob/master/diff/rcppdist.cpp#L24
> git clone https://github.com/helmingstay/rcpp-timings
> cd rcpp-timings/diff
> R --vanilla < glue.R
More information about the Rcpp-devel
mailing list