2018-06-11

TruffleRubyを動かしてみる

GraalVM上で動く超絶速いTruffleRubyを動かしてみました。

macOSで動かすにはEnterprise Editionが必要とのことだったのでDockerのLinux上でCommunity Editionを動かしてみます。

こちらのリポジトリをクローンして make build すれば動きます。

基本的にはoracle/graalの中のDockerfileを参考にしていて、こんな感じで書けばOKです↓
FROM oraclelinux:7-slim

ENV GRAALVM_PKG=graalvm-ce-1.0.0-rc1-linux-amd64.tar.gz \
    JAVA_HOME=/usr/graalvm-1.0.0-rc1/jdk \
    PATH=/usr/graalvm-1.0.0-rc1/bin:$PATH \
    LANG=en_US.UTF-8
ADD $GRAALVM_PKG /usr/

RUN yum -y install gcc && rm -rf /var/cache/yum && \
    alternatives --install /usr/bin/java  java  $JAVA_HOME/bin/java  20000 && \
    alternatives --install /usr/bin/javac javac $JAVA_HOME/bin/javac 20000 && \
    alternatives --install /usr/bin/jar   jar   $JAVA_HOME/bin/jar   20000
RUN gu -c install org.graalvm.ruby

# そのほかbundlerなど色々インストール ...

WORKDIR ~/
RUN /root/.rbenv/shims/bundle install --path=vendor/bundle -j4
RUN /usr/graalvm-1.0.0-rc1/bin/bundle install --path=vendor/bundle -j4

CMD ["graalvm", "--version"]

ベンチマーク

以下のスクリプトを各Rubyで動かしてみました。
#!/usr/bin/env ruby

require 'benchmark/ips'

def call
  i = 0
  while i < 1000
    i += 1
  end
end

call; call; call; call; call # JITを効かせたいがために複数回呼び出す

Benchmark.ips do |x|
  x.report('call') { call }
  x.compare!
end

結果はこちら↓

Ruby 2.6.0-preview2

$ bundle exec ruby ./loop.rb
Warming up --------------------------------------
                call     4.864k i/100ms
Calculating -------------------------------------
                call     58.807k (± 3.8%) i/s -    296.704k in   5.053021s

Ruby 2.6.0-preview2 with MJIT

$ bundle exec ruby --jit ./loop.rb
Warming up --------------------------------------
                call    11.779k i/100ms
Calculating -------------------------------------
                call    347.678k (±11.7%) i/s -      1.720M in   5.027122s

TruffleRuby

$ bundle exec /usr/graalvm-1.0.0-rc1/bin/ruby ./loop.rb
Warming up --------------------------------------
                call    15.809k i/100ms
Calculating -------------------------------------
                call      2.174M (±13.8%) i/s -     10.481M in   4.973496s

JITが効きやすいケースで試したのでアレですが、 MJITありのCRubyはMJITなしと比べて6倍くらい速く、TruffleRubyは37倍くらい速くなっています。凄い…。

このエントリーをはてなブックマークに追加