Функция внутри пакета выполняется медленнее, чем вне пакета

Я использую Rcpp и RcppArmadillo, и у меня "странная" проблема. Допустим, у меня есть функция f1 (). Я включаю эту функцию в свой пакет и запускаю команду «R CMD INSTALL». После этого я запускаю тест и понимаю, что f1 медленнее примерно на 100 микросекунд внутри пакета, чем снаружи. Так что, если функция хочет завершить 100 мс, в пакете требуется около 200 + мс.

Код:

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 )
}

Пример написания моего кода. Я считаю, что проблема в том, что function.R вызывает function.cpp, который вызывает последнюю функцию. Но почему это происходит внутри пакета, а не в sourceCpp. Я не понимаю разницы.


person Manos Papadakis    schedule 08.08.2016    source источник


Ответы (1)


Вкратце:

  • 100 мс - это не проблема. Вы пришли из R, который является интерпретируемой средой

  • Вызов функции включает несколько шагов. Чтобы найти функцию в пакете, нужно еще кое-что.

  • См. Документацию для .Call(), чтобы узнать, как минимизировать поиск.

  • См. Документацию для NAMESPACE, чтобы также установить там идентификаторы.

Последние два момента должны помочь сократить разрыв между вызовом специальной функции в среде (что дешевле) и вызовом функции из правильно созданной инфраструктуры для этого он же пакет.

person Dirk Eddelbuettel    schedule 08.08.2016
comment
Я согласен, что это не проблема, но когда я использую sourceCp, для функции требуется около 22 мс, а той же функции R требуется около 100 мс для вектора из 1000 ячеек. Угадайте, что произошло, когда я вызвал ту же функцию изнутри пакета, она медленнее, чем у R. Вот почему мне интересно, что происходит позади. Я прочитаю документацию по .call. Спасибо за ответ! - person Manos Papadakis; 08.08.2016
comment
Вы только что снова задали свой вопрос. Это разные пути кода для доступа к вашей функции, и поэтому время отличается. C'est la vie. Кстати, не я голосовал против вашего вопроса. - person Dirk Eddelbuettel; 08.08.2016
comment
Хорошо, тогда спасибо за ваш ответ и вашу помощь. Я прочту документацию. Спасибо за информацию о голосовании против. - person Manos Papadakis; 08.08.2016