Ruby3がついにこの冬(12月25日)にリリースされます。3倍速くなる、なんて噂もありますがどうなるでしょうか。Rubyに速度を求めすぎるのは間違っている気がしなくもないですが、個人的に好きな言語だけに期待してしまいます。 そんな中、速度も求める方に試して欲しいのがRubyspeedです。RubyのコードをC言語に変換して実行します。

Rubyspeedの使い方

rubyspeedのテストコード例です。

$ cat test/rubyspeed/c_test.rb 
# frozen_string_literal: true

require 'minitest/autorun'
require_relative '../../lib/rubyspeed'

class RubyspeedTestC < Minitest::Test
  TESTS = []

  def example_add(x)
    x + 1
  end
  TESTS.push(name: :example_add, args: [1], arg_types: [Rubyspeed::T.int], return_type: Rubyspeed::T.int)

  def example_branch(flag, x)
    if flag > 10
      x
    elsif flag > 5
      x + 1
    else
      0
    end
  end
  TESTS.push({name: :example_branch, args: [10, 10], arg_types: [Rubyspeed::T.int, Rubyspeed::T.int], return_type: Rubyspeed::T.int})
  :
end

実行したところです。Rubyspeedのコードは約4倍高速になっています。

$ rake bench
               user     system      total        real
compiled   0.000016   0.000001   0.000017 (  0.000014)
ruby       0.000064   0.000002   0.000066 (  0.000063)

RubyspeedはRubyに型も持たせるSorbetのランタイムにインスパイアされており、RubyのコードをS式に展開した上でC言語にしてコンパイルしています。Rubyの柔軟さをC言語で再現するのは困難な部分もあるはずで、すべてに適用される訳ではないでしょう。しかしついつい期待してしまうソフトウェアです。

RubyspeedはRuby製のソフトウェア(ソースコードは公開されていますがライセンスは明記されていません)です。

agrafix/rubyspeed: Compile ruby functions to C