Rcpp 包内的函数比包外的函数慢

Rcpp 包内的函数比包外的函数慢,rcpp,r-package,Rcpp,R Package,我使用Rcpp和RcppArmadillo,我有一个奇怪的问题。假设我有函数f1。我将此函数包含在我的软件包中,并运行命令R CMD INSTALL。完成后,我运行了一个基准测试,我意识到f1在包内比包外慢100微秒。因此,如果一个函数需要100毫秒才能完成,那么包中的函数需要200毫秒以上 代码: 函数.cpp vec f1(vec x){ vec F( x.size() ); for( int i = 0; i < x.size(); ++i ){ /

我使用Rcpp和RcppArmadillo,我有一个奇怪的问题。假设我有函数f1。我将此函数包含在我的软件包中,并运行命令R CMD INSTALL。完成后,我运行了一个基准测试,我意识到f1在包内比包外慢100微秒。因此,如果一个函数需要100毫秒才能完成,那么包中的函数需要200毫秒以上

代码:

函数.cpp

vec f1(vec x){
    vec F( x.size() );
    for( int i = 0; i < x.size(); ++i ){
         // do something 
    }
    return F;
}
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.cpp

vec f1(vec x){
    vec F( x.size() );
    for( int i = 0; i < x.size(); ++i ){
         // do something 
    }
    return F;
}
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调用一个函数.cpp wich调用最后一个函数。但为什么这发生在包内部而不是sourceCpp中。我无法理解其中的区别。

简单地说:

100毫秒不是问题。您来自R,这是一个解释环境

调用函数需要几个步骤。在包中查找函数需要更多的步骤

请参阅文档,了解如何最大限度地减少查找

请参阅有关命名空间的文档,以便在其中设置标识符

后两点应该有助于缩小在更便宜的环境中调用特殊函数与从正确创建的基础结构中调用函数(也称为包)之间的差距。

简单地说:

100毫秒不是问题。您来自R,这是一个解释环境

调用函数需要几个步骤。在包中查找函数需要更多的步骤

请参阅文档,了解如何最大限度地减少查找

请参阅有关命名空间的文档,以便在其中设置标识符


后两点应该有助于缩小在环境中调用临时函数与从正确创建的基础结构中调用函数(即包)之间的差距。

我同意这不是问题,但当我使用cp p时,它需要大约22毫秒,而相同R的函数需要大约100毫秒对于1000个细胞的载体。猜猜当我从包内调用同一个函数时发生了什么,它比R的慢。这就是为什么我想知道背后发生了什么。我将阅读有关.call的文档。谢谢你的回答!你刚才又重申了你的问题。这些是到达函数的不同代码路径,这就是时间不同的原因。这就是生活。顺便说一句,我不是那个对你的问题投反对票的人。好吧,谢谢你的回答和帮助。我会看文件的。谢谢关于下行表决的通知。我同意than不是一个问题,但是当我使用cp p函数时,它需要大约22毫秒,对于1000个单元的向量,相同的R函数需要大约100毫秒。猜猜当我从包内调用同一个函数时发生了什么,它比R的慢。这就是为什么我想知道背后发生了什么。我将阅读有关.call的文档。谢谢你的回答!你刚才又重申了你的问题。这些是到达函数的不同代码路径,这就是时间不同的原因。这就是生活。顺便说一句,我不是那个对你的问题投反对票的人。好吧,谢谢你的回答和帮助。我会看文件的。谢谢你告诉我投票结果。