# C++11 versus R Standalone Random Number Generation Performance Comparison

March 1, 2014
By

(This article was first published on Lindons Log » R, and kindly contributed to R-bloggers)

If you are writing some C++ code with the intent of calling it from R or even developing it into a package you might wonder whether it is better to use the pseudo random number library native to C++11 or the R standalone library. On the one hand users of your package might have an outdated compiler which doesn’t support C++11 but on the other hand perhaps there are potential speedups to be won by using the library native to C++11. I decided to compare the performance of these two libraries.

#define MATHLIB_STANDALONE
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include "Rmath.h"

int main(int argc, char *argv[])
{
int ndraws=100000000;
std::vector<double> Z(ndraws);
std::mt19937 engine;
std::normal_distribution<double> N(0,1);

for(auto & z : Z ) {
z=N(engine);
}
std::chrono::duration<double> elapsed=end-start;

std::cout <<  elapsed.count() << " seconds - C++11" << std::endl;

for(auto & z : Z ) {
z=rnorm(0,1);
}
elapsed=end-start;

std::cout <<  elapsed.count() << " seconds - R Standalone" << std::endl;

return 0;
}


Compiling and run with:

[michael@michael coda]$g++ normal.cpp -o normal -std=c++11 -O3 -lRmath [michael@michael coda]$ ./normal


## Normal Generation

5.2252 seconds - C++11
6.0679 seconds - R Standalone


## Gamma Generation

11.2132 seconds - C++11
12.4486 seconds - R Standalone


## Cauchy

6.31157 seconds - C++11
6.35053 seconds - R Standalone


As expected the C++11 implementation is faster but not by a huge amount. As the computational cost of my code is dominated by other linear algebra procedures of O(n^3) I’d actually be willing to use the R standalone library because the syntax is more user friendly.

The post C++11 versus R Standalone Random Number Generation Performance Comparison appeared first on Lindons Log.