2016-08-08 9 views
-1

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.

Antwort

3

Kurz:

  • 100ms ist kein Thema. Sie kommen aus R, das eine interpretierte Umgebung ist

  • Das Aufrufen einer Funktion umfasst mehrere Schritte. Das Finden einer Funktion in einem Paket beinhaltet einige mehr.

  • Weitere Informationen zum Minimieren der Suche finden Sie in der Dokumentation zu .Call().

  • Weitere Informationen finden Sie in der Dokumentation zu NAMESPACE.

Die beiden letztgenannten Punkte sollte die Lücke zwischen Aufruf einer Ad-hoc-Funktion in der Umwelt helfen schließen (was billiger ist) Verse eine Funktion aus der ordnungsgemäß erstellt Infrastruktur fordern aka einem Paket so tun .

+0

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

+1

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. –

+0

Ok, dann danke für deine Antwort und deine Hilfe. Ich werde die Dokumentationen lesen. Danke für die Information über das Downvooten. – Csd

Verwandte Themen