昨日書いたベンチマークの記事
http://qiita.com/Nabetani/items/2d054512c45990dd1235
で、JRuby の場合の測定時間の変化が面白かったので、変化だけを調べてみた。
結論:JITすごい。
追記:
もう少し調べた記事を書いた。
JRuby は実行時最適化によって 50倍以上速くなり、CRuby を華麗に抜き去る場合がある。を参照
やってみたことは、
「ちょっと時間がかかる処理を、時間を計りながら20回行う」というプログラムをJRubyで3回、CRuby で1回 動かす、という作業。
で。
まずはグラフ。
JRuby に注目すると。
- どの trial も初回が一番遅い。
- 2回目はいきなり半分ぐらいの時間で処理が終わる。
- 5回目で遅くなり、6回目以降は大きな山はないもののどんどん速くなる。
- 10〜15回目ぐらいで落ち着く感じ。
5回目の山は、JITが頑張っている山なんだと思うけど、どうだろう。
初回と最終回の開きは、いずれも10倍ぐらい。JIT恐るべし。
とはいえ。
今回のコードについてはCRubyが速いので、ちょっと面白みには欠ける。
JIT の威力でCRubyを追い抜く! みたいなストーリーを作りたかったんだけど、そうはならなくて残念。
グラフからは読みにくいけど、CRuby の場合は、最速と最遅で2倍も差がないし、特に傾向も感じられない。
まあ処理時間が短すぎるのでよくわからないんだけれど。
ちなみにソースコードはこんな感じ。
# encode:utf-8
(p RUBY_DESCRIPTION) rescue p "1.8.x or former"
require "benchmark"
def test
a=->(b){->(c){->(d){->(e){ (->(f){f+1})[e] }[d] }[c] }[b] }
r=a[a[a[a[a[a[a[a[a[a[a[a[a[a[
a[a[a[a[a[a[a[a[a[a[a[a[a[a[
1
]]]]]]]]]]]]]]]]]]]]]]]]]]]]
n=400
s=eval("#" "{"*n+"r"+"}"*n)
end
def run_bench
20.times do |ix|
tick = Benchmark.realtime{ test }
puts "%d,%.9f" % [ ix+1, tick ]
end
end
run_bench
ベンチマーク以外には何の役にも立たない馬鹿げたプログラムだと思う。
追記:
JRuby は、
jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [darwin-x86_64]
つまり、JRuby9000 + Java8
で
CRuby は、
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
をつかった。
つまり、両方最新のつもり。ハードウェアは最新じゃないけど。