Я использую 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. Я не понимаю разницы.
Я согласен с тем, что это не проблема, но когда I sourceCp p функция, которая ему нужна около 22 мс, и той же функции R требуется около 100 мс для вектора из 1000 ячеек. Угадайте, что произошло, когда я вызываю ту же функцию изнутри пакета, она медленнее, чем R. Вот почему мне интересно, что происходит позади. Я прочитаю документацию о .call. Спасибо за ответ! – Csd
Вы только что повторили свой вопрос. _Это разные пути кода, чтобы добраться до вашей функции_, и поэтому время отличается. _C'est la vie._ Кстати, я не был тем, кто заворачивал ваш вопрос. –
Хорошо, спасибо за ваш ответ и вашу помощь. Я прочитаю документацию. Спасибо за информацию о downvoting. – Csd