Betrachten wir diesen Vergleich:Warum ist diese vereinfachte Version der cpp-Funktion langsamer?
require(Rcpp)
require(microbenchmark)
cppFunction('int cppFun (int x) {return x;}')
RFun = function(x) x
x=as.integer(2)
microbenchmark(RFun=RFun(x),cppFun=cppFun(x),times=1e5)
Unit: nanoseconds
expr min lq mean median uq max neval cld
RFun 302 357 470.2047 449 513 110152 1e+06 a
cppFun 2330 2598 4045.0059 2729 2879 68752603 1e+06 b
cppFun
langsamer als RFun
scheint. Wieso ist es so? Unterscheiden sich die Zeiten für den Aufruf der Funktionen? Oder ist es die Funktion selbst, die sich in der Laufzeit unterscheidet? Ist es Zeit für Argumente und Argumente? Gibt es eine Datenkonvertierung oder ein Datenkopieren? Ich weiß nicht, wann die Daten an (oder von) cppFun
übergeben werden?
Fremdfunktion Schnittstelle hat Overhead, das sollte keine Überraschung sein. Wenn Ihre Funktion anfängt, tatsächlich nützliche Arbeit zu leisten, werden Sie wahrscheinlich niemals den Overhead bemerken. Aber im Moment kostet deine Funktion nichts außer dem Overhead. –
Stellen Sie sich vor, Sie sind R und CPP ist Ihr hart arbeitender Kollege. Was ist schneller: Wiederholen Sie jeden Satz, der Ihnen gegenüber gesprochen wird, sofort oder gehen Sie zu Ihrem Kollegen und bitten Sie ihn, dies für Sie zu tun? Ändern Sie nun "einen Satz wiederholen" zu "Steuererklärungen machen" und die Dinge könnten sich ändern. (Haftungsausschluss: Ich habe nie versucht, Steuererklärungen in C++ zu machen. Es kann schneller sein, ist aber wahrscheinlich auch komplizierter als in R). –
@JeroenMostert Als Doktorand sind meine Steuererklärungen ziemlich einfach zu handhaben;) Danke für die Metapher! –