2016-12-06 51 views
0

執行次數是否與以下不同?`<-`實際上比`=`慢嗎?

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 

我得到一個警告,說明大約75%的評估具有非正定的執行時間。但是,每次運行此操作時,我都會得到一致的結果:平均而言,x = NULLx <- NULL快。

+0

這兩個[call](https://github.com/wch/r-source/blob/trunk/src/main/names.c#L100)[相同的C函數](https://github.com /wch/r-source/blob/trunk/src/main/eval.c#L2685)。沒有性能差異。 – Roland

回答

3

microbenchmark功能解析...參數以不同的方式。 x=NULL從不被解釋爲一個assigment,但作爲一個函數的參數。 所以,就我所知,你並沒有真正測量第一個參數的時間。

你需要做這樣的事情:

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

或@Roland在評論中介紹。 這將調用賦值運算符後面的相應函數。

+0

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

3

這些語句在這種情況下不會做同樣的事情。你會看到這一點,如果你運行例如

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

此創建的對象x,但沒有對象y。您可以運行你換貨測試使用括號來運行:

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