我使用 Rcpp 和 RcppArmadillo,我有一个“奇怪”的问题。假设我有函数 f1()。我将这个函数包含在我的包中并运行命令“R CMD INSTALL”。完成后,我运行了一个基准测试,我意识到 f1 在包内比在包外慢约 100 微秒。所以如果一个函数需要 100ms 来完成,在包中需要大约 200+ms。
代码:
函数.cpp
vec f1(vec x){
vec F( x.size() );
for( int i = 0; i < x.size(); ++i ){
// do something
}
return F;
}
Run Code Online (Sandbox Code Playgroud)
导出函数.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
}
Run Code Online (Sandbox Code Playgroud)
导出函数
f1<- function(x) {
.Call( ' MyPackage_f1 ' , PACKAGE = ' MyPackage ', x )
}
Run Code Online (Sandbox Code Playgroud)
我的代码是如何编写的一个例子。我相信问题在于 function.R 调用 function.cpp 至调用最终函数。但是为什么这会发生在包内而不是在 sourceCpp 中。我无法理解其中的区别。
简要地:
100ms 不是问题。你来自 R,它是一个解释环境
调用函数涉及几个步骤。在包中查找函数涉及更多。
请参阅文档.Call()以了解如何最小化查找。
请参阅文档以NAMESPACE在那里设置标识符。
后两点应该有助于缩小在环境中调用临时函数(更便宜)与从正确创建的基础设施调用函数之间的差距,也就是包。