为什么这个简单的cpp函数版本较慢?
考虑这种比较:为什么这个简单的cpp函数版本较慢?
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
?
这不仅仅是上面提到的注释中的一个适当的问题或者深思熟虑的问题。
空函数的假设基线根本不是一个。通过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))
在我的盒子,我看到版本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
正如我们说在现实世界中:没有没有免费的午餐。
哦,这是完全合理的。这是@BenVoigt在评论中提到的“开销”吗?谢谢 –
是的,除其他外。 'cppFun()'和'RFun2()'实际上有一个可执行代码的主体。 'RFun1()'不。它们在运行时如何可能相等?尝试衡量“空洞”时,你也会犯新人貌相错误。这确实没有太大的意义。 –
好吧,我认为这对我来说很有意义+1。非常感谢! –
外部函数接口有开销,这不应该是一个惊喜。当你的函数开始做一些实际有用的工作时,你可能永远不会注意到开销。但是现在你的功能除了开销之外不需要任何费用。 –
想象一下,你是R,CPP是你勤奋的同事。更快的方法是:立即重复对你说的任何句子,或者走向你的同事,并要求他们为你做这件事?现在,将“重复一个句子”改为“做纳税申报”,事情可能会有所不同。 (免责声明:我从来没有尝试过使用C++进行纳税申报,但这可能会更快,但可能比在R中做更复杂。) –
@JeroenMostert作为博士生,我的纳税申报很容易处理; )感谢比喻! –