LoginSignup
4
0

More than 5 years have passed since last update.

truffleruby のマイクロベンチマーク

Posted at

先日。
何の気なしに

rbenv install -l

としてみたら、下の方に truffleruby-1.0.0-rc14 などの見慣れない文字が。

なんだろうと思ってぐぐってみたら

A high performance implementation of the Ruby programming language. Built on the GraalVM by Oracle Labs.
( https://github.com/oracle/truffleruby )

とのこと。本当に速いの? と思って今日も楽しいマイクロベンチマーク。

走らせたコード

走らせたのはこんなコード:

fobo.rb
# frozen_string_literal: true

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

p fibo(ARGV[0].to_i)

測るコード

こいつを走らせて集計するスクリプトはこんな感じ:

bench.rb
# frozen_string_literal: true

require "json"

ENVS = [
  [ '2.6.2' ],
  [ '2.6.2', '--jit' ],
  [ 'jruby-9.2.6.0' ],
  [ 'truffleruby-1.0.0-rc14' ],
]

def rbenv(v)
  path = `RBENV_VERSION='#{v}' rbenv which ruby`.rstrip
  yield(path)
end

data = ENVS.each.with_object(Hash.new{ |h,k| h[k]={} }) do |(e,opt),o|
  name = [e,opt].compact.join("/")
  opt ||= ""
  (28..42).each do |n|
    rbenv(e) do |ruby|
      tick = /real\s+(\d+m[\d\.]+s)/.match(%x[(time "#{ruby}" #{opt} fibo.rb #{n}) 2>&1])[1]
      o[name][n]=tick
      $stderr.puts( [name, n, tick].join(" ") )
    end
  end
end

puts( JSON.pretty_generate(data))

出走者は

  • CRuby 2.6.2 ( 通常 )
  • CRuby 2.6.2 ( --jit )
  • jruby-9.2.6.0
  • truffleruby-1.0.0-rc14

の四名。

ビジュアライズするコード

出てきた JSON を以下のスクリプトでグラフにする:

julia
using Plots
using JSON

jstxt = open("result.json") do file
  read(file, String)
end

data = JSON.parse(jstxt)

function to_sec(x)
  strm,strs = split(x, "m")
  m=parse(Float64,strm)
  s=parse(Float64,strs[1:length(strs)-1])
  m*60+s
end

envs = [ "2.6.2", "2.6.2/--jit", "jruby-9.2.6.0", "truffleruby-1.0.0-rc14" ]
k = sort(collect(keys(data[envs[1]])))
println(k)
y = map( env->begin
  values = map( x->data[env][x], k )
  return map( to_sec, values )
end, envs )

plot( y,
  legend = :topleft,
  label = envs,
  xlabel = "Argument of fibo",
  ylabel = "result of time (real)",
  xticks = (1:length(k), k),
  yscale=:log10
)

savefig("plot.pdf")

このスクリプト。実行するのに 20秒以上かかる。なんでだろ。

まあそれはいいとして。
できたグラフは下図。

image.png

truffleruby は全領域で JRuby に勝っている。
起動時間がやや遅いが、計算量が多くなると CRuby や CRuby+JIT を抜いて一位になる。
なるほど速い。

しかし、まだ release candidate なので困ることもあると思う。

オフラインリアルタイムどう書くのような遊びでは役に立つと思うけどどうだろう(次回=最終回?の問題が計算量が気になる問題とは限らないけどね)

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0