Ich habe an einem Paket gearbeitet, das Rcpp verwendet, um beliebigen R-Code über eine Gruppe von großen medizinischen Bilddateien anzuwenden. Ich habe festgestellt, dass meine Rcpp-Implementierung wesentlich langsamer ist als die ursprüngliche reine C-Version. Ich habe den Unterschied zum Aufruf einer Funktion über Function gegenüber dem ursprünglichen Rf_eval verfolgt. Meine Frage ist, warum gibt es eine fast vierfache Leistungseinbuße, und gibt es eine Möglichkeit, den Funktionsaufruf zu beschleunigen, um in der Leistung zu Rf_eval näher zu sein?Rcpp Funktion langsamer als Rf_eval
Beispiel:
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))
Ergebnisse
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
Sind Sie sich bewusst, dass Sie _sind eine eine R-Funktion von C++ Aufruf _ einschließlich aller angemessenen Aufwand, wenn Sie 'RCPP :: Function'? Wie können Sie erwarten, dass dies schneller als nur R ist? –
Darüber hinaus, wenn Sie denken, 'Rf_eval()' ist, was Ihren Bedürfnissen entspricht, warum verwenden Sie es nicht? Rcpp verhindert das nicht, wie das Beispiel zeigt. –
Das direkte Aufrufen von 'Rf_eval()' aus einem C++ - Kontext ist auch gefährlich, da R-Fehler (dh C 'longjmp's) die Destruktoren von C++ - Objekten umgehen und Speicherleck verursachen/undefiniertes Verhalten verursachen. 'Rcpp :: Function' versucht sicherzustellen, dass das nicht passiert. –