考虑这种比较:
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
似乎比RFun
慢。为什么会这样?调用函数的时间有所不同吗?或者是运行时间不同的功能本身?是传递和返回参数的时间吗?是否有一些数据转换或数据复制我不知道何时将数据传递给cppFun
(或从div {
background-size: 100%;
transition: all 0.2s ease;
}
div:hover, div:focus {
background-size: 115% 115%;
}
返回?
答案 0 :(得分:12)
正如上面的评论所表明的那样,这根本不是一个好的或经过深思熟虑的问题。
空函数的假设基线不是一个。通过cppFunction()
等创建的每个函数都将调用一个R函数连接到某些C ++函数。所以这根本不可能是平等的。
这是一个稍微有意义的比较。首先,让我们使用curlies完成R功能。其次,让我们调用另一个编译器(内部)函数:
require(Rcpp)
require(microbenchmark)
cppFunction('int cppFun (int x) {return x;}')
RFun1 <- function(x) { x }
RFun2 <- function(x) { .Primitive("abs")(x) }
print(microbenchmark(RFun1(2L), RFun2(2L), cppFun(2L), times=1e5))
在我的方框中,我看到a)版本1和版本2(或C ++函数)之间的距离越近,b)对内部函数的惩罚越小。 但是从R调用任何已编译的函数都需要花费。
Unit: nanoseconds
expr min lq mean median uq max neval
RFun1(2L) 171 338 434.136 355 408 2659984 1e+05
RFun2(2L) 683 937 1334.046 1257 1341 7605628 1e+05
cppFun(2L) 721 1131 1416.091 1239 1385 8544656 1e+05
正如我们在现实世界中所说:没有免费的午餐。