JRuby - Java powered Ruby implementation

JRubyの開発者であるCharles Nutter氏が自身のブログにおいてHow JRuby Makes Ruby Fastのタイトルのもと、JRubyのパフォーマンス計測結果を報告している。Charles Nutter氏は竹内関数の一種であるTak関数を使ったベンチマークを例に取り上げ、インタプリタモードから最適化が実施されたコンパイルモードの動作までをまとめている。紹介されているデータをまとめると次のとおり。

実行環境 実行時間[s]
Ruby 1.8.6p114 18.22
Ruby 1.9.1p0 3.61
JRuby 1.3.0-dev, interpreted, client VM 26.81
JRuby 1.3.0-dev, interpreted, server VM 8.00
JRuby 1.3.0-dev, compiled (unoptimized), server VM 4.00
JRuby 1.3.0-dev, compiled (heap scope optz), server VM 3.00
JRuby 1.3.0-dev, compiled (heap scope + bracktrace frame optz), server VM 2.79
JRuby 1.3.0-dev, compiled (heap scope + heap frame optz), server VM 2.05
JRuby 1.3.0-dev, compiled (heap scope, heap frame, fastops optz), server VM 1.52
JRuby 1.3.0-dev, compiled (heap scope, heap frame, fastops, threadless, positionless optz), server VM 1.48
JRuby 1.3.0-dev, compiled ("--fast", dyncall optz), server VM 1.42
JRuby 1.3.0-dev, compiled ("--fast", dyncall optz, recursion optz), server VM 0.36

How JRuby Makes Ruby Fastベンチマークデータグラフ

前評判どおり、Ruby 1.8系と1.9系では実行速度が高速化されていることがわかる。Charles Nutter氏が実施した今回のケースではRuby 1.9.1の方が5倍ほど高速に動作している。JRubyはインタプリタモードで動作しているときはRuby 1.8.6と比較して速度が7割ほどしかでていない。しかしインタプリタモードでもJava仮想マシンをサーバVMで動作させるとRuby 1.8.6よりも2.3倍ほど高速に、Ruby 1.9.1と比べると0.45倍ほどまで迫っている。

サーバVMのままさらにインタプリタからコンパイルモードに変えると、ほとんどRuby 1.9.1と変わらない実行速度を実現しており、さらに各種最適化を実施することで実行速度は向上し、How JRuby Makes Ruby Fastで紹介している限りでは最終的にRuby 1.8.6よりも50倍、Ruby 1.9.1よりも10倍高速な実行速度が計測されている。

実行環境 Ruby 1.8.6p114比較 (実行速度倍率)
Ruby 1.8.6p114 1
Ruby 1.9.1p0 5.01
JRuby 1.3.0開発版, インタプリタ, クライアントVM 0.68
JRuby 1.3.0開発版, 最新最適化済みコンパイル, サーバVM 50.61

How JRuby Makes Ruby Fastベンチマークデータグラフ その2

Ruby 1.8.6よりも50倍高速なバージョンはいくつかのケースで動かないことが確認されているため、JRuby 1.3には取り込まれないとみられる。ひとつ前のRuby 1.8.6よりも12.8倍高速、Ruby 1.9.1よりも2.54倍高速のあたりまでの実装が取り込まれるとみられる。

Charles Nutter氏はHow JRuby Makes Ruby FastでDuby氏が実施した「:fixnum」というキーワードを指定して動作するようにしたケースも取り上げ、1,000回実施といったように回数を引き上げているにも関わらず平均の実行速度が0.013秒になるという桁違いの高速化を実現していることにも触れ、:fixnumを加えるといったように言語仕様を変更しているためRubyの実行とはいえないが、JRubyにもまだまだ高速化の余地があるだろうと結んでいる。

なお寄せられているコメントにはRuby 1.9.2devとMacRuby version 0.5で実験したとみられる結果も掲載されており、Charles Nutter氏が示したもっとも高速なベンチマーク結果に匹敵する速度が実現されていることがわかる。Tak関数で計測できるベンチマークは性能の1側面でしかないが、ひとつの指針であることには間違いない。MacRubyは次のリリースでさらにパフォーマンスを向上させるとみられており、Ruby実装系の実行速度競争がしばらく続くことになりそうだ。