我使用Rcpp和RcppArmadillo,我有一个"奇怪的"问题。让我们说我有函数f1()。我在我的包中包含了这个函数并运行命令" R CMD INSTALL"。完成之后,我运行基准测试,我意识到f1在包内的速度比外部慢100微秒。因此,如果函数需要100ms才能完成,那么在包中需要大约200 + ms。
代码:
functions.cpp
vec f1(vec x){
vec F( x.size() );
for( int i = 0; i < x.size(); ++i ){
// do something
}
return F;
}
exportfunctions.cpp
vec f1(vec x);
RcppExport SEXP MyPackage_f1(SEXP xSEXP) {
BEGIN_RCPP
RObject __result;
RNGScope __rngScope;
traits::input_parameter< vec >::type x(xSEXP);
__result = wrap(f1(x));
return __result;
END_RCPP
}
exportfunctions.R
f1<- function(x) {
.Call( ' MyPackage_f1 ' , PACKAGE = ' MyPackage ', x )
}
我的代码编写方式的一个示例。 我相信问题是一个函数.R调用一个函数调用最终函数的函数。但是为什么会在包内发生,而不是在sourceCpp中发生。我无法理解其中的差异。
答案 0 :(得分:4)
简言之:
100毫秒不是问题。你是来自R,这是一个解释的环境
调用函数涉及几个步骤。在包中查找函数涉及更多功能。
请参阅.Call()
的文档,了解如何最大限度地减少查询。
请参阅NAMESPACE
的文档,以便在其中设置标识符。
后两点应该有助于缩小在环境中调用ad-hoc函数(更便宜)与从正确创建的基础架构调用函数之间的差距< / em>又名包。