Thursday, October 4, 2007

JRuby Compiler Performance

I was pretty excited when I heard that JRuby's compiler was complete. I figured I could run some benchmarks against the C-Based Ruby Implementation to see how it was performing. I've only run this suite once, but I hope to provide enough info so that you could replicate the results yourself. Please let me know if you think I missed something.

The Setup

The benchmarks were run on a Dell D820 laptop. It has an Intel Core Duo running at 2.17GHz and has 1GB of RAM. I'm running Ubuntu 7.04 for an OS. The only wrinkle in my setup is that my root partition is encrypted using LUKS/dmcrypt. This will probably slow down the IO benchmarks, but I'm assuming it would penalize both Ruby implementations equally.

For the C-Based Ruby Implementation, I'm using the Ubuntu packaged Ruby version 1.8.5. For JRuby, I checked out the latest from Codehaus's SVN (Rev 4474) and built the code using Sun's Java version 1.6.0.

For the benchmarks, I pulled the suite from the Ruby Lang SVN (Rev 13608). 

I ran the benchmarks using the run.rb script. The C-Based Ruby Implementation was run with no command line options. I modified the script to run JRuby withe the following options:

  • -C to compile the ruby code before running it
  • -O to disable ObjectSpace
  • -J-Djruby.thread.pooling=true to enable thread pooling
  • -J-server to put the JVM in server mode

These options are explained in the Performance Tuning and Compiler pages of the JRuby Wiki.

The Results

The following shows the time it took the Ruby Implementation to perform the benchmark in seconds:

Here is the difference between the two implementations (CRuby - JRuby) again, in seconds:

As you can see, JRuby is performing really well on a lot of these benchmarks. It gets killed on eval, but I suppose that is to be expected. My guess is that JRuby is taking advantage of Java primitives to outperform CRuby at number crunching. Charles Nutter's comments at another blog entry on JRuby benchmarking seem to indicate that this would be the case. Can't wait until JRuby is 1.1