Ich benutze Rcpp und RcppArmadillo und ich habe ein "seltsames" Problem. Sagen wir, dass ich die Funktion f1() habe. Ich schließe diese Funktion in mein Paket ein und führe den Befehl "R CMD INSTALL" aus. Nachdem ich fertig bin, starte ich einen Benchmark und mir ist klar, dass f1 innerhalb von 100 Mikrosekunden langsamer ist als draußen. Also wenn eine Funktion will 100ms zu beenden, will in dem Paket etwa 200 + ms.Funktion in einem Paket ist langsamer als außerhalb des Pakets
Code:
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)
}
Ein Beispiel, wie mein Code geschrieben wurde. Ich glaube, das Problem ist, dass eine Funktion.R eine Funktion.cpp aufruft, die die letzte Funktion aufruft. Aber warum passiert das im Paket und nicht in sourceCpp? Ich kann den Unterschied nicht verstehen.
Ich stimme zu, als ist kein Problem, aber wenn ich SourceCp p die Funktion benötigt es etwa 22 ms und die gleiche R-Funktion benötigen etwa 100 ms für einen Vektor von 1000 Zellen. Raten Sie, was passiert ist, wenn ich die gleiche Funktion innerhalb des Pakets anrufe, es ist langsamer als Rs. Deshalb frage ich mich, was dahinter passiert. Ich werde die Dokumentation über .call lesen. Danke für die Antwort! – Csd
Sie haben gerade Ihre Frage erneut formuliert. _Dies sind verschiedene Codepfade, um zu Ihrer Funktion zu gelangen _ und deshalb ist das Timing anders. _C'est la vie._ Nebenbei war ich nicht derjenige, der deine Frage abwertete. –
Ok, dann danke für deine Antwort und deine Hilfe. Ich werde die Dokumentationen lesen. Danke für die Information über das Downvooten. – Csd