1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*- 2 3 // this version expands convolve8_cpp by making Vec mimic the structure of 4 // NumericVector. It peforms well, so this is is not the structure of 5 // NumericVector that is the problem. So what is it then ? 6 // 7 // could it be because NumericVector is in a different library than 8 // this code, so that operator[] is not inlined ? 9 // 10 // clues: 11 // - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3538.html 12 13 #include <Rcpp.h> 14 15 class Cache{ 16 public: 17 typedef double& proxy ; 18 typedef double* iterator ; 19 Cache(iterator data_)20 Cache( iterator data_) : data(data_){} 21 ref(int i)22 inline proxy ref(int i){ return data[i] ; } ref(int i) const23 inline proxy ref(int i) const { return data[i] ; } 24 25 private: 26 iterator data ; 27 } ; 28 29 class Vec { 30 public: 31 typedef double& proxy ; 32 Vec(double * data_)33 Vec( double* data_ ) : cache(data_){} operator [](int i)34 inline proxy operator[]( int i){ return cache.ref(i) ; } operator [](int i) const35 inline proxy operator[]( int i) const { return cache.ref(i) ; } 36 37 private: 38 Cache cache ; 39 } ; 40 41 convolve9cpp(SEXP a,SEXP b)42RcppExport SEXP convolve9cpp(SEXP a, SEXP b){ 43 Rcpp::NumericVector xa(a); 44 Rcpp::NumericVector xb(b); 45 int n_xa = xa.size() ; 46 int n_xb = xb.size() ; 47 int nab = n_xa + n_xb - 1; 48 Rcpp::NumericVector xab(nab); 49 50 Vec vab(xab.begin()), va(xa.begin()), vb(xb.begin()) ; 51 52 for (int i = 0; i < n_xa; i++) 53 for (int j = 0; j < n_xb; j++) 54 vab[i + j] += va[i] * vb[j]; 55 56 return xab ; 57 } 58 59 #include "loopmacro.h" 60 LOOPMACRO_CPP(convolve9cpp) 61 62