検索
ニュース

「Ruby 2」の3倍の高速化を目指した「Ruby 3.0.0」が公開7年ぶりのメジャーリリース

オープンソースプログラミング言語「Ruby」の最新メジャーリリース「Ruby 3.0.0」が公開された。新版の主な改善点はパフォーマンス改善、並行処理、静的解析の3点。

Share
Tweet
LINE
Hatena

 Ruby開発チームは2020年12月25日、オープンソースプログラミング言語「Ruby」の最新メジャーリリース「Ruby 3.0.0」(以下、Ruby 3.0)を公開したと発表した。

 Ruby 3.0はパフォーマンスの改善、並行処理、静的解析の3点を目標に開発されてきた。特にパフォーマンス改善については、「Ruby 3x3」として「Ruby 3はRuby 2の3倍速くする」ことが目標に掲げられてきた。

 実際にRuby 3.0では、Optcarrotベンチマークで3倍の高速化を達成できた。


OptcarrotベンチマークでRuby 3.0はRuby 2.0の3倍を達成(出典:ruby-lang.org

パフォーマンスを改善

 Ruby 2.6で導入されたJIT(Just In Time)コンパイラアーキテクチャ「MJIT」にさまざまな改善が施された。これにより、AIやOptcarrotで性能を評価できるゲームなど、少数のメソッドを多数呼び出すことに多くの時間を費やすアプリケーションの性能をJITが改善できるようになった。

 一方、生成コードのサイズを大幅に削減したものの、「さまざまなメソッドを満遍なく呼び出す『i-cache』への負荷が大きい『Rails』のようなワークロードでは、JITコンパイラがその負荷を大きくしてしまうため、性能を改善できる状態には至っていない」とRubyチームは述べ、Ruby 3.1での改善を表明している。

並行処理を実験的に導入

 アクターモデル風の並行並列制御機構である「Ractor」が実験的に導入された。Ractorはスレッド安全に関する懸念がなく、Rubyで並列処理を実行できるように設計されている。

 複数のRactorを作成すると、並列計算機上で並列に実行される。Ractor間では、ほとんどのオブジェクトが共有できないように設計されており、スレッド安全なプログラムを記述可能だ。Ractor間のコミュニケーションはメッセージの送受信が担う。

def tarai(x, y, z) =
  x <= y ? y : tarai(tarai(x-1, y, z),
                     tarai(y-1, z, x),
                     tarai(z-1, x, y))
require 'benchmark'
Benchmark.bm do |x|
  # sequential version
  x.report('seq'){ 4.times{ tarai(14, 7, 0) } }
  # parallel version
  x.report('par'){
    4.times.map do
      Ractor.new { tarai(14, 7, 0) }
    end.each(&:take)
  }
end
ベンチマーク用に竹内関数を4回実行するコード
Benchmark result:
          user     system      total        real
seq  64.560736   0.001101  64.561837 ( 64.562194)
par  66.422010   0.015999  66.438009 ( 16.685797)
逐次実行にかかった時間(seq)と4並列実行の時間(par)。並列化で3.87倍高速化できた

 併せて、処理をブロックさせるI/Oなどの操作をフックするための「Fiber Scheduler」も導入された。この機能により、既存コードを変更せずに、軽量な並行制御を実現できるようになった。

静的解析ツールを導入

 Rubyプログラムの型を記述するための言語「RBS」や、型解析ツール「TypeProf」が導入された。TypeProfをはじめとする静的解析を実行するツールは、RBSを利用することでRubyプログラムをより精度良く解析できる。Ruby 3.0には、RBSで書かれた型定義を処理できるライブラリ「rbs gem」も同梱されている。

 TypeProfはまだ実験的機能であり、現在は主に一種の型推論に使用される。型注釈のない普通のRubyコードを入力すると、どのようなメソッドが定義され、どのように使われているかを解析し、型シグネチャのプロトタイプをRBSフォーマットで生成する。

 これらの改善の他、次のような新機能も導入した

  • 1行パターンマッチを再設計した(実験的機能)
  • findパターンを追加した(実験的機能)
  • 一行メソッド定義が書けるようになった
  • Hash#exceptが組み込みになった

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る