包内的函数比包外的慢

Man*_*kis 1 rcpp r-package

我使用 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 中。我无法理解其中的区别。

Dir*_*tel 5

简要地:

  • 100ms 不是问题。你来自 R,它是一个解释环境

  • 调用函数涉及几个步骤。在包中查找函数涉及更多。

  • 请参阅文档.Call()以了解如何最小化查找。

  • 请参阅文档以NAMESPACE在那里设置标识符。

后两点应该有助于缩小在环境中调用临时函数(更便宜)与从正确创建的基础设施调用函数之间的差距,也就是包。

  • 你刚刚再次重申了你的问题。_这些是到达您的函数的不同代码路径_,这就是时间不同的原因。_C'est la vie._ 顺便说一句,我不是反对你的问题的人。 (2认同)