Speeding up Rake and Rails in Ruby 1.9.2

Our team at work is currently in the beginning stages of a new project, that we started on Ruby 1.9.2 and Rails 3.1.  Most of our previous work was all Ruby 1.8.7 (Ruby Enterprise Edition) and Rails 2, though I have worked on a couple of REE 1.8.7 + Rails 3.0 apps.

I’ve also jumped with both feet (and not in the fun, fancy, parkour sense, in the 37-year old, flat arched, off a perfectly good one-story building onto concrete sense) into testing, and tenuously into TDD — and I think my first comment was “man, these tests are hella slow.”.  Only it’s not the tests that are slow (yet) — it’s rake.  That was my second comment — “what the hell is wrong with rake?”  My co-workers even looked at me a little funny when I brought it up.

As we were getting started last month, Rails 3.1 was still in RC status — and I would spend time browsing the Rails issues keeping track of the progress — and I remember reading this issue about Rails 3.1 boot performance — and reading the comment about the “require issue”.   That led me via Google to this stack overflow post and this rubyonrails core post — which I basically chalked up “core problem, it’ll be fixed one day”

Well that “one day” is now, because I can’t take it anymore.

This is the rails console startup in REE-1.8.7/Rails 2.3.14

rubydev:darmok (ree-1.8.7@extension_production)$ time script/consoleLoading development environment (Rails 2.3.14)>> exit    real	0m5.820suser	0m4.847ssys	0m0.787s

This is the rails console startup in 1.9.2/Rails 3.1

rubydev:knappsack (ruby-1.9.2@exrails31)$ time rails consoleLoading development environment (Rails 3.1.0)>> exit    real	0m18.766suser	0m17.020ssys	0m1.444s

Just a flat out “rake –tasks” takes over 9 seconds in 1.9.2/Rails 3.1!

So thankfully, google, the internet, and other irritated developers to the rescue. Thanks to this blog post from Xavier Shay (via: Peter Cooper at Ruby Inside, that I missed in my feeds the first time because “1.9.3” is not on my radar) — and especially this gist from Todd Fisher — and I have a glimmer of relief.

The quick instructions for the above:

  1. grab the patch from the gist
curl https://raw.github.com/gist/1008945/4edd1e1dcc1f0db52d4816843a9d1e6b60661122/ruby-1.9.2p290.patch > load.patch
  1. patch ruby
$ rvm cleanup all; rvm install 1.9.2 --patch ./load.patch -n patched
  1. copy my gemset(s) over
rvm gemset copy 1.9.2@exrails31 1.9.2-p290-patched@exrails31
  1. change my .rvmrc for the project…and voila!
rubydev:knappsack (ruby-1.9.2@exrails31)$ time rails consoleLoading development environment (Rails 3.1.0)>> exit    real	0m9.722suser	0m8.607ssys	0m1.081s

rake –tasks is now 6 seconds instead of 9, and test initialization is correspondingly faster as well.

It’s not REE 1.8.7/Rails 2 — but I’ll take any speedup I can get.