教育-用Rcpp理解递归函数的可变性能
Educational - understanding variable performance of recursive functions with Rcpp
这个问题不是实际问题,我只是想对观察到的现象做出合理的解释。我正在阅读Dirk Eddelbuettel的无缝R和C++与Rcpp集成(使用R!)。在介绍之后,我将研究两个简单的"斐波那契函数"。
在RStudio中,我有一个cpp文件,其结构如下
fib_fun.cpp
#include <Rcpp.h>
// [[Rcpp::export]]
int fibonacci(const int x) {
if (x < 2)
return x;
else
return (fibonacci(x -1)) + fibonacci(x-2);
}
/*** R
# Call the fib function defined in R
fibonacci(10)
*/
我还有一个相同功能的内联实现:
inline_fib.R
# Inline fib implementation
incltxt <- "int fibonacci(const int x) {
if (x == 0) return(0);
if (x == 1) return(1);
return fibonacci(x - 1) + fibonacci(x - 2);
}"
# Inline call
require(inline)
fibRcpp <- cxxfunction(signature(xs = "int"), plugin = "Rcpp",
includes = incltxt,
body = "int x = Rcpp::as<int>(xs);
return Rcpp::wrap(fibonacci(x));")
当我对函数进行基准测试时,我得到以下结果:
> microbenchmark(fibonacci(10), fibRcpp(10), times = 10) Unit: microseconds expr min lq mean median uq max neval fibonacci(10) 3.121 3.198 5.5192 3.447 3.886 23.491 10 fibRcpp(10) 1.176 1.398 3.9520 1.558 1.709 25.721 10
问题
- 我想了解为什么这两个功能之间的性能存在显著差异
- 关于使用Rcpp的实用性,什么通常被认为是良好的做法?在我天真的时候,我的第一个直觉是编写一个函数并通过
sourceCpp
获取它的源代码,但这种解决方案似乎要慢得多
基准代码
require(microbenchmark); require(Rcpp); require(inline)
sourceCpp("fib_fun.cpp"); source("inline_fib.R")
microbenchmark(fibonacci(10), fibRcpp(10), times = 10)
评论回复
我尝试了使用unsigned int
而不是int
的函数,结果:
Unit: microseconds
expr min lq mean median uq max neval
fibonacci(10) 2.908 2.992 5.0369 3.267 3.598 20.291 10
fibRcpp(10) 1.201 1.263 6.3523 1.424 1.639 50.536 10
以上所有好评。
函数在x=10
太轻了,您需要比times=10
更频繁地调用way才能找到任何有意义的东西。你在测量噪音。
至于风格,我们大多数人更喜欢fibonacci()
通过Rcpp属性。。。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 递归函数和性能在C++
- 递归函数中的许多参数会导致性能问题吗
- 教育-用Rcpp理解递归函数的可变性能
- 递归函数严重降低性能