Hatena::Grouphackathon

zrail (a.k.a. tobira17, h14i, ...) の Learning Log

2011-10-31

[][]Rubinius の ruby 1.9 モード 22:10 Rubinius の ruby 1.9 モード - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - Rubinius の ruby 1.9 モード - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

Rubinius をインストールしてみたけど 1.9 に対応してなくてガッカリ、と思ってしまった人向け。ちゃんと 1.9.2 モードもあるよ!まだまだこれからだけど!

詳細は Inside the Rubinius 2.0 Preview Release - Rubinius を読んでくださいね。


Rubinius を使ってるような rubyist の中でも更に尖ってる人たちは知っているだろうけど、 Rubinius のオプションには ruby 1.8.7 モードと 1.9.2 モードを切り替えるスイッチがある。

僕の予想では、大抵の人は RVM あたりのバージョンマネージャを使っていると思うので、コンパイルタイムオプションについては書かない。

んで、実行モードを指定するには、起動時に -X19 または -X18 を渡してあげる。こんな感じ。*1

% rbx -v
rubinius 2.0.0dev (1.8.7 c116f06c yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]
% rbx -X19 -v
rubinius 2.0.0dev (1.9.2 c116f06c yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]

現時点の Rubinius がどの程度 1.9 系をサポートできているのかよく分かってません。すいません。

ああ、それから「俺は 1.9 モードでしか使いたくないんだ」って向きは環境変数 RBXOPT=-X19 を設定すると良いらしいです。


こんな感じのベンチマークも取ってみた*2んだけど、 あんまり変わらないね。-X18 も -X19 も同じようなバイトコードを吐くってことかな。

def fib(n)
  if n <= 1
    return 1
  else
    return fib(n-1) + fib(n-2)
  end
end

require 'benchmark'
n = ($n || 34).to_i
Benchmark.bm(10) do |x|
  x.report(RUBY_VERSION) { fib(n) }
end
                user     system      total        real
1.8.7       3.422480   0.000000   3.422480 (  3.443763)
1.8.7       3.252506   0.001000   3.253506 (  3.291893)
1.8.7       3.357489   0.000000   3.357489 (  3.405878)
1.8.7       3.286501   0.000000   3.286501 (  3.331286)
1.8.7       3.279502   0.000000   3.279502 (  3.326297)

                user     system      total        real
1.9.2       3.280501   0.002000   3.282501 (  3.302130)
1.9.2       3.183516   0.000000   3.183516 (  3.198741)
1.9.2       3.363489   0.000999   3.364488 (  3.379368)
1.9.2       3.403482   0.001000   3.404482 (  3.419116)
1.9.2       3.271502   0.000000   3.271502 (  3.292675)

参考

Inside the Rubinius 2.0 Preview Release - Rubinius

Rubinius 1.0.0 が速すぎてびっくりした

*1:余談。JRuby の場合は --1.9 を付けると 1.9.x モードになる。

*2:kwatchさんのコードをほぼそのまま使いました。