Rubiniusを試す #1 (Install,Benchmark)
だいぶ久しぶりの投稿です。
ちょいとふと思い立ってやってみたので、メモ。
Macにrbenv(ruby-build)でRubinius
をインストールする。
Rubiniusとは
http://rubini.us/doc/ja/what-is-rubinius/
Rubinius は プログラミング言語 Ruby の実装です。 Rubiniusには、バイトコード仮想マシン、Rubyの構文解析器、バイトコードコンパイラ、世代別ガベージコレクタ、ジャストインタイム (JIT) ネイティブマシンコードコンパイラ、そして、Ruby のコアライブラリと標準ライブラリが含まれています。 Rubinius は Ruby 2.1.0 を目標としています。
とのこと。
https://github.com/rubinius/rubinius/tree/master/kernel/bootstrap 読みやすい(Rubyで実装されている)
昔見た時は「全部Rubyで書いてある」って聞いた気がするんだけどVMはC++で書かれてるな。
といっても、当時ちゃんと知らなかったので、何か変わったのか、変わってないのかは、わからない。
一番の特徴はスレッドがGVL(Giant VM Lock)の制約を受けない為、マルチコアが活かせること。
つまり、PumaやSidekiqのようにマルチスレッドで動作する場合に優位性があるのではないかと思う。
環境
インストールマシン
Rubinius
- version: 2.5.7
Requirements
事前に必要なモノを入れておく
といっても、多分LLVMだけ入れておけば良い。
が、Homebrewで最新のLLVMを入れると3.6
が入ってしまう。
Rubinius(rbx-2.5.7)はLLVM3.0-3.5
じゃないと怒られてしまうので、
LLVM3.5を入れる(インストールしなくてもバイナリがあれば良い)
- PreBuildされたバイナリがあるので、ダウンロード
- http://llvm.org/releases/download.html#3.5.2
Pre-built Binaries:
->Clang for Mac OS X
- 適当な場所に解凍しておく
もしかしたら
gem install rubinius-melbourne
しといた方がよいのかも
ruby-buildを最新にする
※以下、ruby-build
をbrewでinstallしている場合
ruby-build
のFormulaがまだ、2.5.7
が入ってるrevisionを見ていないので、強制的にmasterのHEADを向ける
brew upgrade --HEAD ruby-build
Installation
さて、やっとインストールするが、ちょいと環境変数が多くなるので、整理
LDFLAGS=-L{解凍先}/lib \ CPPFLAGS=-I{解凍先}/include \ CC={解凍先}/clang \ CXX={解凍先}/clang++ \ RUBY_CONFIGURE_OPTS="--llvm-config={解凍先}/bin/llvm-config" \ rbenv install -v rbx-2.5.7
こんな感じで多分行ける
試してみる
❯ rbenv versions system 2.0.0-p353 2.2.1 * 2.2.2 rbx-2.5.7
rbenv local rbx-2.5.7
❯ ruby -v rubinius 2.5.7 (2.1.0 d4fdeaad 2015-06-28 3.5.2 JI) [x86_64-darwin14.3.0]
ベンチってみる
簡単なfibonacciの関数書いて試してみる
require 'benchmark' def fib(n) if n == 0 0 elsif n == 1 1 else fib(n-1) + fib(n-2) end end Benchmark.bmbm do |x| x.report("fibonacci") { fib(40) } end
負荷がかかれば何でも良いので、中身はあまり気にしない
Ruby 2.2.2
❯ ruby fib.rb Rehearsal --------------------------------------------- fibonacci 20.300000 0.050000 20.350000 ( 21.297663) ----------------------------------- total: 20.350000sec user system total real fibonacci 20.620000 0.060000 20.680000 ( 21.640249)
Rubinius 2.5.7
❯ ruby fib.rb Rehearsal --------------------------------------------- fibonacci 7.426329 0.117764 7.544093 ( 7.756742) ------------------------------------ total: 7.544093sec user system total real fibonacci 5.223988 0.064434 5.288422 ( 6.797919)
感想
- パフォーマンス的には以外と差がでた
- ただ、実行する度に割りと速度にばらつきがある
- 5s〜10s
- 原因までは追ってない
- ただ、実行する度に割りと速度にばらつきがある
- 厳密にマルチスレッドになると、ちゃんとマルチスレッドプログラミングできてないと危険
- Rubiniusの運用ノウハウが無いので本番で使うことはきっと無いだろう
- 日本で使ってるところあるんだろうか?
- 最近も開発は割りと進んでいるようなので、もうすこしいろいろやってみたい