Node FTW

tl;dr

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%.

 
9
Kudos
 
9
Kudos

Now read this

Conditional Custom Templates with Action Pack Variants

tl;dr Variants were introduced in Rails 4.1 making it possible to conditionally render a view template. Before Rails 4.1 we employed a custom technique dubbed MultipleTemplates to provide similar functionality. Here we present our... Continue →