先日、
JRuby は JIT によって 10倍ぐらい速くなる場合がある。
という記事を書いたんだけど、測りなおしたらそんなもんじゃなかったことがわかった。
まずはグラフ。対数目盛に注意。
わけのわからないところに横線があるが、一本2倍になっている。
今回は、【「とある無駄な計算」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
代わり映えしないけどこんな感じで。