Я работаю над пакетом, который использует Rcpp для применения произвольного R-кода в группе больших файлов медицинских изображений. Я заметил, что моя реализация Rcpp значительно медленнее, чем исходная чистая версия C. Я проследил разницу, вызвав функцию через функцию, по сравнению с исходным Rf_eval. Мой вопрос заключается в том, почему существует около 4-кратное снижение производительности, и есть ли способ ускорить вызов функции, чтобы быть ближе к производительности Rf_eval?Функция Rcpp медленнее, чем Rf_eval
Пример:
library(Rcpp)
library(inline)
library(microbenchmark)
cpp_fun1 <-
'
Rcpp::List lots_of_calls(Function fun, NumericVector vec){
Rcpp::List output(1000);
for(int i = 0; i < 1000; ++i){
output[i] = fun(NumericVector(vec));
}
return output;
}
'
cpp_fun2 <-
'
Rcpp::List lots_of_calls2(SEXP fun, SEXP env){
Rcpp::List output(1000);
for(int i = 0; i < 1000; ++i){
output[i] = Rf_eval(fun, env);
}
return output;
}
'
lots_of_calls <- cppFunction(cpp_fun1)
lots_of_calls2 <- cppFunction(cpp_fun2)
microbenchmark(lots_of_calls(mean, 1:1000),
lots_of_calls2(quote(mean(1:1000)), .GlobalEnv))
Результаты
Unit: milliseconds
expr min lq mean median uq max neval
lots_of_calls(mean, 1:1000) 38.23032 38.80177 40.84901 39.29197 41.62786 54.07380 100
lots_of_calls2(quote(mean(1:1000)), .GlobalEnv) 10.53133 10.71938 11.08735 10.83436 11.03759 18.08466 100
Вы знаете, что вы _are вызывающую функцию R от C++ _ включая все накладные расходы, соразмерные при использовании 'Rcpp :: Function'? Как вы можете ожидать, что это будет быстрее, чем просто R? –
Кроме того, если вы считаете, что 'Rf_eval()' соответствует вашим потребностям, почему бы вам не использовать его? Rcpp не мешает вам делать это, как демонстрирует пример. –
Кроме того, вызов 'Rf_eval()' непосредственно из контекста C++ опасен, поскольку ошибки R (то есть C 'longjmp's) будут обходить деструкторы объектов C++ и утечки памяти/вызывать неопределенное поведение в целом. 'Rcpp :: Function' пытается убедиться, что этого не происходит. –