2016-12-06 1 views
0

Ist der folgende Unterschied in den Ausführungszeiten echt?Ist `<-` tatsächlich langsamer als` = `?

library(microbenchmark) 
microbenchmark(x = NULL, x <- NULL, times = 100e3) 

Unit: nanoseconds 
     expr min lq mean median uq max neval 
     x 0 0 0.60819  0 0 8426 1e+05 
x <- NULL 0 0 1.75101  0 1 8727 1e+05 

Ich bekomme eine Warnung, dass etwa 75% der Bewertungen eine nichtpositive Ausführungszeit hatten. Nichtsdestotrotz erhalte ich jedes Mal, wenn ich das ausgeführt habe, ein konsistentes Ergebnis: x = NULL ist im Durchschnitt schneller als x <- NULL.

+0

Beide [Anruf] (https://github.com/wch/r-source/blob/trunk/src/main/names.c#L100) die [gleiche C-Funktion] (https://github.com /wch/r-source/blob/trunk/src/main/eval.c#L2685). Es gibt keinen Leistungsunterschied. – Roland

Antwort

3

Die microbenchmark Funktionen die ... Argumente auf verschiedene Weise analysiert. Die x=NULL wird nie als Zuweisung interpretiert, sondern als Funktionsargument. Also Sie, soweit ich das beurteilen kann, messen nicht wirklich die Zeit für das erste Argument.

Sie brauchen so etwas wie dies zu tun:

microbenchmark(test1 = `=`(x, NULL), test2 = `<-`(x, NULL), times = 100e3) 

oder als @Roland in den Kommentaren beschrieben. Dies ruft die entsprechenden Funktionen hinter den Zuweisungsoperatoren auf.

+0

'microbenchmark (test1 = {x = NULL}, test2 = {x <- NULL}, mal = 100e3)' – Roland

3

Diese Aussagen machen in diesem Zusammenhang nicht dasselbe. Sie werden das sehen, wenn Sie zum Beispiel laufen

microbenchmark(y = NULL, x <- NULL, times = 100e3) 

Dieses ein Objekt erstellt x, aber kein Objekt y. Sie können den Test Sie Klammern laufen ment laufen:

microbenchmark({y = NULL}, {x <- NULL}, times = 100e3) 
Verwandte Themen