「Ruby 2」の3倍の高速化を目指した「Ruby 3.0.0」が公開:7年ぶりのメジャーリリース
オープンソースプログラミング言語「Ruby」の最新メジャーリリース「Ruby 3.0.0」が公開された。新版の主な改善点はパフォーマンス改善、並行処理、静的解析の3点。
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倍の高速化を達成できた。
パフォーマンスを改善
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
Benchmark result: user system total real seq 64.560736 0.001101 64.561837 ( 64.562194) par 66.422010 0.015999 66.438009 ( 16.685797)
併せて、処理をブロックさせる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.
関連記事
- “Be Hungry-ous” フレンチエンジニアは全てを楽しむ
フランス出身のNicolas Modrzyk(ニコラ・モドリック)氏は持ち前の人懐っこさとユーモアを武器に、OSSのイベントや書籍出版などさまざまなチャレンジをする。そんな同氏がエンジニアに送る「Be Hungry-ous」の意味とは。 - Ruby 2.6が公開、JITコンパイラを実装
「Ruby 2.6.0」が公開された。JIT(Just-In-Time)コンパイラが導入されたことに加え、処理性能を向上させる改善が複数施されている。終点なしRangeなどの新機能も実装された。 - 難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Rubyの「黒魔術」といわれるメタプログラミングの概要、self、特異メソッド、特異クラス、オープンクラス、モンキーパッチなどの使い方をコード例を交えて解説します。