# Rubyアソシエーション開発助成金2019 メンター報告書

プロジェクト：複数ファイルに対応したプリコンパイル機構の作成
開発者：永山 涼雅
メンター：笹田耕一

# プロジェクト概要

MRI において、bootsnap などでブート速度改善のために利用されているバイト
コードシリアライズ機構（バイトコードをバイナリへ変換する仕組み）を改善す
ることで、さらなるブート速度の改善、バイナリサイズの削減などを目指すプロ
ジェクトである。基本的なアイディアは、複数のバイナリをまとめる仕組みを作
ることになる。現在のシリアライズ機構は、一つの .rb ファイルに対して 1 つ
のバイナリを出力するしかできないが、これを複数の .rb ファイルに対して 1
つのバイナリを出力することで、複数のファイルにまたがる冗長な箇所を削減し、
ファイル操作オーバヘッドを低減し、ローカリティを向上させるものである。

# 計画の達成状況

複数のバイナリを統合させる仕組みを作り、10% 以上のサイズ削減効果を確認し
た。この仕組みは (1) MRI に複数 .rb ファイルからバイナリを生成・読み込み
を行う API の作成、および (2) この API を用いた bootsnap と同様のライブ
ラリの作成の二つによって実現された。しかし、Rails アプリでの起動時間は
1.6 倍の性能低下となった。

本プロジェクトでは、これ以上の改善は難しいと判断し、中間報告をもってプロ
ジェクトの終了を決定した。

# メンターとして果たした役割

2週間に1度程度の頻度でオンライミーティングを開催し、進捗や設計実装につい
て議論した。また、プロジェクト続行について議論を行い、中間報告を最終報告
とすると決定した。

# 今後の期待

本プロジェクトによって、素直に結合および重複排除するだけではブート速度が
低下することがわかった。各アプリでのブート手順はあまり変わらないはずなの
で、プロファイリングによってバイトコードバイナリをさらに整列することで、
ローカリティ向上によるブート時間改善が期待できるため、今後このような仕組
みを導入する必要があると考える。

# まとめ

本プロジェクトでは、まずは目標としていた複数 .rb ファイルに対応したバイ
トコードシリアライザの実現および性能評価を実現した。また、ナイーブに実装
するだけではロード時間は増えてしまうと言う問題点も明らかにした。この分野
の今後の発展に期待したい。
