先日。
何の気なしに
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 )
とのこと。本当に速いの? と思って今日も楽しいマイクロベンチマーク。
走らせたコード
走らせたのはこんなコード:
# 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)
測るコード
こいつを走らせて集計するスクリプトはこんな感じ:
# 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 を以下のスクリプトでグラフにする:
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秒以上かかる。なんでだろ。
まあそれはいいとして。
できたグラフは下図。
truffleruby は全領域で JRuby に勝っている。
起動時間がやや遅いが、計算量が多くなると CRuby や CRuby+JIT を抜いて一位になる。
なるほど速い。
しかし、まだ release candidate なので困ることもあると思う。
オフラインリアルタイムどう書くのような遊びでは役に立つと思うけどどうだろう(次回=最終回?の問題が計算量が気になる問題とは限らないけどね)