Node FTW


Want to crunch some numbers? Node is 10x faster than Ruby.

I used to do a lot of scientific computing. My work environment had both Matlab and NumPy/SciPy all tricked out. These days I don’t do too much number crunching, spending most of my time with Ruby and JavaScript.

Recently I’ve been interested in the math of split testing so what do you think I turned to when it was time to do some simulations? That’s right, Ruby… I didn’t really think about what I was doing before I jumped in.

I had reached for Ruby even though the I coding up a numerical simulation instead of some web app. I wanted to simulate 100,000 coin flips as one trial, and then repeat it for a bunch of trials to decrease the statistical sampling error. Here’s the results:

$ ruby aa.rb 100

Trials: 100

Total Time: 21.243 seconds

But I needed more accuracy

$ ruby aa.rb 300

Trials: 300

Total Time: 62.260 seconds

Still need more accuracy
$ ruby aa.rb 1000

Trials: 1000

Total Time: 208.607 seconds

This is ridiculous. While I was waiting for the last simulation to finish I started thinking about setting up MATLAB or NumPy. Then it hit me. Why did I reach for Ruby when I could have coded in JavaScript?! JavaScript is a scripting language that I’m intimately acquainted with, so it takes me roughly the same amount of time to code in JavaScript as it does to code in Ruby. But what a difference in runtime:

$ node aa.js 100

Trials: 100

Total time: 1.855 seconds

$ node aa.js 300

Trials: 300

Total time: 5.486 seconds

$ node aa.js 1000

Trials: 1000

Total time: 17.726 seconds

10x faster than Ruby.

So thanks Node/Google/V8, for making JavaScript awesome!

EDIT: I just ran the JavaScript version of the script in the Chrome console and it still beat Ruby by 30%.


Now read this

The Math of Split Testing Part 1: Statistical Sampling Uncertainty

tl;dr Here we introduce the idea of statistical sampling uncertainty in the content of conversion rate optimization for website design. We begin by illustrating how successive trials of coin flips result in the binomial mass function.... Continue →