【发布时间】:2016-09-28 20:48:01
【问题描述】:
考虑这个比较:
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?
【问题讨论】:
-
外函数接口有开销,这不足为奇。当你的函数开始做一些真正有用的工作时,你可能永远不会注意到开销。但是现在你的函数除了开销之外没有任何成本。
-
想象你是 R 并且 CPP 是你勤奋的同事。更快的是:立即重复对您说过的任何一句话,或者走到您的同事身边并让他们为您做这件事?现在,把“重复一句话”改成“做纳税申报”,事情可能会变得不同。 (免责声明:我从未尝试在 C++ 中进行纳税申报。它可能更快,但也可能比在 R 中更复杂。)
-
@JeroenMostert 作为一名博士生,我的纳税申报表很容易处理;)谢谢你的比喻!
-
@Remi.b:我期待您更快地实施。完成后,您是否介意在时间机器和perpertuum mobile 上工作?
-
@DirkEddelbuettel 哼...我不明白这种讽刺的原因。你的意思是我在 cmets 的跟进太广泛了? (我已经将 Rcpp 用于更复杂的过程,我只是想知道多次调用 cpp 函数是否会付出代价)。
标签: r performance function benchmarking rcpp