2016-08-08 9 views
-1

Я использую 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) 
} 

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

ответ

3

Кратко:

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

  • Вызов функции включает в себя несколько этапов. Поиск функции в пакете включает в себя еще несколько.

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

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

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

+0

Я согласен с тем, что это не проблема, но когда I sourceCp p функция, которая ему нужна около 22 мс, и той же функции R требуется около 100 мс для вектора из 1000 ячеек. Угадайте, что произошло, когда я вызываю ту же функцию изнутри пакета, она медленнее, чем R. Вот почему мне интересно, что происходит позади. Я прочитаю документацию о .call. Спасибо за ответ! – Csd

+1

Вы только что повторили свой вопрос. _Это разные пути кода, чтобы добраться до вашей функции_, и поэтому время отличается. _C'est la vie._ Кстати, я не был тем, кто заворачивал ваш вопрос. –

+0

Хорошо, спасибо за ваш ответ и вашу помощь. Я прочитаю документацию. Спасибо за информацию о downvoting. – Csd