Rubyの新しいJIT「MJIT」で早速遊んでみた(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Playing with ruby’s new JIT: MJIT 原文公開: 2018/02 著者: John Hawthorn 画像は英語記事からの引用です。 Rubyの新しいJIT「MJIT」で早速遊んでみた(翻訳) Just-in-timeは幻想である: Albert Einstein (元ネタ: Time is an illusion) 今週、Takashi Kokubun (@k0kubun)がMRI Rubyに最初の実装をmergeしました。 I've just committed the initial JIT compiler for Ruby. It's not still so fast yet (especially it's performing badly with Rails for now), but we have much time to improve it until Ruby 2.6 (or 3.0) release. https://t.co/7mO5FZM80C — k0kubun (@k0kubun) February 4, 2018 commitの解説にあるように、MRI RubyのJITはまだ登場したばかりです。まだRailsを高速化できる状態ではなく、現状では初期プロトタイプの一部が前より遅くなっているものもありますが、それでもJITは登場しました。 私はJITの登場に興奮しました。Rubyは以前から遅いという評判がありました(本当に遅いと言えるのは一部にとどまりますが)。JITはこの点を解決できる可能性があります。 JITは実験段階ですが、私は試さずにはいられませんでした。 MRI trunkをcloneしてビルドし、~/.rubiesディレクトリにインストールしてみました。 $ git clone https://github.com/ruby/ruby $ cd ruby $ autoconf $ ./configure –prefix=$HOME/.rubies/ruby-2.6.0-dev $ make $ make install 続いて新しいRubyに切り替えました。 $ chruby 2.6 $ ruby -v ruby 2.6.0dev (2018-02-05 trunk 62211) [x86_64-linux] Advent of Code 2017のday 15で使った私のソリューションでテストしました(以下がネタバレ)。 def calculate(a, b, n = 40_000_000) n.times.count do a = a * 16807 % 2147483647 b = b * 48271 % 2147483647 (a & 0xffff) == (b & 0xffff) end end raise unless calculate(65, 8921) == 588 p result: calculate(699, 124) このコードはRuby JIT向けの理想的な候補となるはずです。コストの高い他のメソッドを呼び出さずに単に演算を実行しており、ほぼインタプリタの速度にのみ縛られるはずだからです。 $ time ruby –disable-gems 15a.rb {:result=>600} 8.30s user 0.00s system 100% cpu 8.306 total $ time ruby –disable-gems –jit 15a.rb {:result=>600} 6.42s user 0.03s … Continue reading Rubyの新しいJIT「MJIT」で早速遊んでみた(翻訳)