LoginSignup
5
5

More than 5 years have passed since last update.

JRuby は JIT によって 10倍ぐらい速くなる場合がある。

Last updated at Posted at 2015-08-28

昨日書いたベンチマークの記事
http://qiita.com/Nabetani/items/2d054512c45990dd1235
で、JRuby の場合の測定時間の変化が面白かったので、変化だけを調べてみた。

結論:JITすごい。

追記:

もう少し調べた記事を書いた。
JRuby は実行時最適化によって 50倍以上速くなり、CRuby を華麗に抜き去る場合がある。を参照

やってみたことは、
「ちょっと時間がかかる処理を、時間を計りながら20回行う」というプログラムをJRubyで3回、CRuby で1回 動かす、という作業。
で。
まずはグラフ。

Kobito.GULL7m.png

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]

をつかった。
つまり、両方最新のつもり。ハードウェアは最新じゃないけど。

5
5
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
5
5