|
Rcpp Version 0.9.10
|
Faster recursive computation of Fibonacci numbers via Rcpp
#!/usr/bin/r ## this short example was provided in response to this StackOverflow questions: ## http://stackoverflow.com/questions/6807068/why-is-my-recursive-function-so-slow-in-r ## and illustrates that recursive function calls are a) really expensive in R and b) not ## all expensive in C++ (my machine sees a 700-fold speed increase) and c) the byte ## compiler in R does not help here. ## inline to compile, load and link the C++ code require(inline) ## byte compiler require(compiler) ## we need a pure C/C++ function as the generated function ## will have a random identifier at the C++ level preventing ## us from direct recursive calls incltxt <- ' int fibonacci(const int x) { if (x == 0) return(0); if (x == 1) return(1); return (fibonacci(x - 1)) + fibonacci(x - 2); }' ## now use the snipped above as well as one argument conversion ## in as well as out to provide Fibonacci numbers via C++ fibRcpp <- cxxfunction(signature(xs="int"), plugin="Rcpp", incl=incltxt, body=' int x = Rcpp::as<int>(xs); return Rcpp::wrap( fibonacci(x) ); ') ## for comparison, the original (but repaired with 0/1 offsets) fibR <- function(seq) { if (seq == 0) return(0); if (seq == 1) return(1); return (fibR(seq - 1) + fibR(seq - 2)); } ## also use byte-compiled R function fibRC <- cmpfun(fibR) ## load rbenchmark to compare library(rbenchmark) N <- 35 ## same parameter as original post res <- benchmark(fibR(N), fibRC(N), fibRcpp(N), columns=c("test", "replications", "elapsed", "relative", "user.self", "sys.self"), order="relative", replications=1) print(res) ## show result