[Rcpp-commits] r374 - in pkg: inst src src/Rcpp

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Fri Jan 15 09:32:41 CET 2010


Author: romain
Date: 2010-01-15 09:32:40 +0100 (Fri, 15 Jan 2010)
New Revision: 374

Modified:
   pkg/inst/ChangeLog
   pkg/src/ExpressionVector.cpp
   pkg/src/NumericVector.cpp
   pkg/src/RObject.cpp
   pkg/src/Rcpp/NumericVector.h
   pkg/src/Rcpp/RObject.h
Log:
caching in NumericVector to improve dramatically performance of operator[]

Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/inst/ChangeLog	2010-01-15 08:32:40 UTC (rev 374)
@@ -1,3 +1,9 @@
+2010-01-15  Romain Francois <francoisromain at free.fr>
+
+	* src/Rcpp/NumericVector.h: cache the start of the array to
+	improve performance of operator[]
+	* src/NumericVector.cpp: idem
+
 2010-01-13  Romain Francois <francoisromain at free.fr>
 
 	* R/cpp.package.skeleton.R: new function cpp.package.skeleton

Modified: pkg/src/ExpressionVector.cpp
===================================================================
--- pkg/src/ExpressionVector.cpp	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/src/ExpressionVector.cpp	2010-01-15 08:32:40 UTC (rev 374)
@@ -37,7 +37,7 @@
 				{
 					SEXP res = R_NilValue ;
 					try{
-						SEXP res = Evaluator::run( Rf_lang2( Rf_install("as.expression"), x ) ) ;
+						res = Evaluator::run( Rf_lang2( Rf_install("as.expression"), x ) ) ;
 					} catch( const Evaluator::eval_error& e){
 						throw not_compatible( "could not convert to an expression vector" ) ;
 					}

Modified: pkg/src/NumericVector.cpp
===================================================================
--- pkg/src/NumericVector.cpp	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/src/NumericVector.cpp	2010-01-15 08:32:40 UTC (rev 374)
@@ -25,36 +25,41 @@
 
 namespace Rcpp{
 	
-	NumericVector::NumericVector(SEXP x) throw(not_compatible) : VectorBase() {
+	NumericVector::NumericVector(SEXP x) throw(not_compatible) : VectorBase(), start(0) {
 		switch( TYPEOF( x ) ){
 			case REALSXP:
 				setSEXP( x ) ;
+				update() ;
 				break ;
 			case INTSXP:
 			case LGLSXP:
 			case RAWSXP:
 				setSEXP( Rf_coerceVector( x, REALSXP) ) ;
+				update() ;
 				break ;
 			default:
 				throw not_compatible( "cannot convert to numeric vector" ) ;
 		}
 	}
 	
-	NumericVector::NumericVector(int size) : VectorBase() {
+	NumericVector::NumericVector(int size) : VectorBase(), start(0) {
 		setSEXP( Rf_allocVector(REALSXP, size) ) ;
+		start = REAL(m_sexp) ;
 	}
 
 #ifdef HAS_INIT_LISTS	
-NumericVector::NumericVector( std::initializer_list<int> list ) : VectorBase() {
+NumericVector::NumericVector( std::initializer_list<int> list ) : VectorBase(), start(0) {
 		SEXP x = PROTECT( Rf_allocVector( REALSXP, list.size() ) ) ;
 		std::copy( list.begin(), list.end(), REAL(x) ); 
-		setSEXP(x) ;
+		setSEXP(x);
+		update() ;
 		UNPROTECT( 1 ); /* x */
 	}
-	NumericVector::NumericVector( std::initializer_list<double> list ) : VectorBase() {
+	NumericVector::NumericVector( std::initializer_list<double> list ) : VectorBase(), start(0) {
 		SEXP x = PROTECT( Rf_allocVector( REALSXP, list.size() ) ) ;
 		std::copy( list.begin(), list.end(), REAL(x) ); 
-		setSEXP(x) ;
+		setSEXP(x);
+		update() ;
 		UNPROTECT( 1 ); /* x */
 	}
 #endif

Modified: pkg/src/RObject.cpp
===================================================================
--- pkg/src/RObject.cpp	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/src/RObject.cpp	2010-01-15 08:32:40 UTC (rev 374)
@@ -143,6 +143,5 @@
 	return "array or list out of bounds" ;
 }
 
-
 } // namespace Rcpp
 

Modified: pkg/src/Rcpp/NumericVector.h
===================================================================
--- pkg/src/Rcpp/NumericVector.h	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/src/Rcpp/NumericVector.h	2010-01-15 08:32:40 UTC (rev 374)
@@ -44,14 +44,21 @@
 	NumericVector( std::initializer_list<double> list ) ;
 #endif
 
-	inline double& operator[]( const int& i ) { return REAL(m_sexp)[i]; }
-	inline const double& operator[]( const int& i ) const { return REAL(m_sexp)[i]; }
-
-	inline double* begin() const { return REAL(m_sexp) ; } 
-	inline double* end() const   { return REAL(m_sexp)+LENGTH(m_sexp);}
-
+	// inline double& operator[]( const int& i ) { return REAL(m_sexp)[i]; }
+	// inline const double& operator[]( const int& i ) const { return REAL(m_sexp)[i]; }
+	// inline double* begin() const { return REAL(m_sexp) ; } 
+	// inline double* end() const   { return REAL(m_sexp)+LENGTH(m_sexp);}
+	
+	inline double& operator[]( const int& i ) { return start[i] ; }
+	inline const double& operator[]( const int& i ) const { return start[i]; }
+	inline double* begin() const { return start ; } 
+	inline double* end() const   { return start+LENGTH(m_sexp);}
+	
 	typedef double* iterator ;
 
+private:
+	double *start ;
+	inline void update(){ start = REAL(m_sexp);}
 } ;
 
 } // namespace

Modified: pkg/src/Rcpp/RObject.h
===================================================================
--- pkg/src/Rcpp/RObject.h	2010-01-14 21:00:22 UTC (rev 373)
+++ pkg/src/Rcpp/RObject.h	2010-01-15 08:32:40 UTC (rev 374)
@@ -223,7 +223,7 @@
      * to change it, use setSEXP
      */
     SEXP m_sexp ;
-
+    
 private:
 
     void preserve(){ if( m_sexp != R_NilValue ) R_PreserveObject(m_sexp) ; } 



More information about the Rcpp-commits mailing list