LoginSignup
10
11

More than 5 years have passed since last update.

JRuby は実行時最適化によって 50倍以上速くなり、CRuby を華麗に抜き去る場合がある。

Last updated at Posted at 2015-08-29

先日、
JRuby は JIT によって 10倍ぐらい速くなる場合がある。
という記事を書いたんだけど、測りなおしたらそんなもんじゃなかったことがわかった。

まずはグラフ。対数目盛に注意。
わけのわからないところに横線があるが、一本2倍になっている。

Kobito.lsPRQu.png

今回は、【「とある無駄な計算」10回セット】を200回行った。
「とある無駄な計算」は、前回と同じ。
前回は「とある無駄な計算」を20回だったので、計算の規模は百倍になる。
前回は平均をとったが、今回は平均はとっていない。

という辺りが前回との違い。

グラフを見ると、あまり出入りのない CRuby に対し、JRuby は出入りが多い。
グラフが凸凹しているのは、測定しているのが生の時間だから、他のプロセスがCPUを専有していたのかもしれないんだけど、JRuby と CRuby の傾向の違いは読み取れると言っていいと思う。

横軸の回数は、【10回セット】の回数なので、前回のグラフの右端は、今回のグラフでは左端の方にある。

今回は横軸が 70 の辺りで JRuby が CRuby を抜き去っているんだけど、前回のグラフになおすと700 の辺りになるので全然我慢が足りなかったといえる。
ちなみに。
10回セットに変更したのは、時間が短くなりすぎて測れないという弊害を避けるため。

グラフを見ての通り。
最初はJRuby が10倍以上遅かったんだけど、70回目ぐらいにCRuby を抜き去り、最終的には CRuby の倍ぐらい速いというところに落ち着いている。
JRuby は40倍以上速くなっている。
40倍以上と書いたが、10回セット同士で比べているので、1回ごとの速度比で見ると、50倍を超えていることは間違いない。

一方。CRuby はとくに動きはない。ところどころ遅くなっているが、鋭いピークもなければ速くなっているようなトレンドもない。

実行時最適化の結果を保存する方法があるといいと思うけど、あるのかなぁ(未調査)。

追記。
ソースコード載せ忘れてた。

#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
  200.times do |ix|
    tick = Benchmark.realtime{ 10.times{ test } }
    puts "%d,%.9f" % [ ix+1, tick ]
  end
end

run_bench

代わり映えしないけどこんな感じで。

10
11
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
10
11