r - 为什么这个 Rcpp 代码不比纯 R 快?
问题描述
配置
我用斐波那契数尝试了一些 R 和 Rcpp 基准。
纯R
我们将fibR
函数用于纯 R 编写的代码。
fibR <- function(n) {
if (n < 2)
n
else
fib(n - 1) + fib(n - 2)
}
rcpp
fib
我们对用 Rcpp 编写的代码使用另一个函数。
library(Rcpp)
Rcpp::cppFunction('int fib(int x) {
if((x < 2))
return(x);
else
return(fib(x-1) + fib(x-2));
}')
结果
以下是根据几个基准测试的结果。
library(rbenchmark)
在那之后,我做了几次测试。
benchmark(fib(30), fibR(30))[,1:3]
test replications elapsed
1 fib(30) 100 0.46
2 fibR(30) 100 0.45
benchmark(fib(31), fibR(31))[,1:3]
test replications elapsed
1 fib(31) 100 0.77
2 fibR(31) 100 0.80
benchmark(fib(32), fibR(32))[,1:3]
test replications elapsed
1 fib(32) 100 1.37
2 fibR(32) 100 1.33
benchmark(fib(33), fibR(33))[,1:3]
test replications elapsed
1 fib(33) 100 1.88
2 fibR(33) 100 2.02
benchmark(fib(34), fibR(34))[,1:3]
test replications elapsed
1 fib(34) 100 3.09
2 fibR(34) 100 3.26
benchmark(fib(35), fibR(35))[,1:3]
test replications elapsed
1 fib(35) 100 5.57
2 fibR(35) 100 5.60
benchmark(fib(36), fibR(36))[,1:3]
test replications elapsed
1 fib(36) 100 8.95
2 fibR(36) 100 8.51
benchmark(fib(37), fibR(37))[,1:3]
test replications elapsed
1 fib(37) 100 16.94
2 fibR(37) 100 14.47
benchmark(fib(38), fibR(38))[,1:3]
test replications elapsed
1 fib(38) 100 22.92
2 fibR(38) 100 23.67
benchmark(fib(39), fibR(39))[,1:3]
test replications elapsed
1 fib(39) 100 35.80
2 fibR(39) 100 38.83
我希望 Rcpp 代码比等效的 R 代码稳定地快,但不——它有时更慢!
为什么它会这样工作,我错过了什么?
解决方案
当某些事情不是真的时,您应该仔细检查正在发生的事情:)
在这里,您的 R 函数调用了您的 C++ 函数,因为您不小心fib()
从哪里来。一个修复的,更明确的版本如下。
代码
fibR <- function(n) {
if (n < 2)
n
else
fibR(n - 1) + fibR(n - 2)
}
library(Rcpp)
Rcpp::cppFunction('int fibRcpp(int x) {
if ((x < 2))
return(x);
else
return(fibRcpp(x-1) + fibRcpp(x-2));
}')
library(rbenchmark)
benchmark(fibRcpp(30), fibR(30))[,1:3]
输出
test replications elapsed
2 fibR(30) 100 80.846
1 fibRcpp(30) 100 0.153
这是一个经过充分研究的例子。查看 Rcpp 安装中的目录examples/Misc/以获取几年前更新的示例。另请查看关于 SO 的先前问题。
推荐阅读
- php - file_get_content:打开流失败:没有这样的文件或目录
- django - 无法访问正在运行的 django 服务器?
- java - 向实用程序类映射注入依赖项
- r - 如何从具有四舍五入数字的数据框中将表格导出为 PNG
- python - 我无法在 Windows 上安装 kivy。命令行返回回溯错误
- html - 垂直对齐标记内标签失败
- html - 如何在 React-bootstrap 中有一个固定在顶部但不在小视口上的导航栏?
- url - 我购买了域名,如何在该域名下拥有两个以上的网址?
- javascript - 在 JISON 中解析单个产品
- javascript - Vue 组件未安装或渲染且没有错误消息