成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

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で書いてある」って聞いた気がするんだけどVMC++で書かれてるな。

といっても、当時ちゃんと知らなかったので、何か変わったのか、変わってないのかは、わからない。

一番の特徴はスレッドがGVL(Giant VM Lock)の制約を受けない為、マルチコアが活かせること。

つまり、PumaやSidekiqのようにマルチスレッドで動作する場合に優位性があるのではないかと思う。

環境

インストールマシン

  • OS: Mac OSX 10.10.3
  • CPU: 3.1 GHz Intel Core i7
  • Memory: 16 GB 1867 MHz DDR3

Rubinius

  • version: 2.5.7

Requirements

事前に必要なモノを入れておく

といっても、多分LLVMだけ入れておけば良い。

が、Homebrewで最新のLLVMを入れると3.6が入ってしまう。

Rubinius(rbx-2.5.7)はLLVM3.0-3.5じゃないと怒られてしまうので、

LLVM3.5を入れる(インストールしなくてもバイナリがあれば良い)

もしかしたら

gem install rubinius-melbourne

しといた方がよいのかも

ruby-buildを最新にする

※以下、ruby-buildbrewで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の運用ノウハウが無いので本番で使うことはきっと無いだろう
    • 日本で使ってるところあるんだろうか?
  • 最近も開発は割りと進んでいるようなので、もうすこしいろいろやってみたい