GraalVM上で動く超絶速いTruffleRubyを動かしてみました。
macOSで動かすにはEnterprise Editionが必要とのことだったのでDockerのLinux上でCommunity Editionを動かしてみます。
こちらのリポジトリをクローンして make build
すれば動きます。
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倍くらい速くなっています。凄い…。